java - Jersey 消耗二维数组

标签 java rest jersey

我正在使用 jersey 开发 REST Web 服务。

我按以下格式提交数据:

var data = new Array();
data.push({ name: 'field1', value: "123" });
data.push({ name: "field2", value: "XYZ" });

现在我想以以下格式发送附加数据:

    var products = new Array();
    products.push({ name: 'product1', value: "5" });
    products.push({ name: 'product2', value: "8" });
    products.push({ name: 'product3', value: "12" });

    data.push({ name: "products", value: products });

泽西网络服务代码:

@Path("/myRequestPath")
@POST
@Produces({ MediaType.APPLICATION_JSON })
public MetaDataStatus processChangeRequest(
    @FormParam("field1") String field1,
    @FormParam("field2") String field2,
          //how to read products here?
    )
{
}

我的问题是如何在 Jersey 网络服务中使用上述产品数据?

最佳答案

不要以这种格式发送数据。使用可轻松映射到 Java 对象的对象。您需要了解的第一件事是数据在 JSON 中的外观以及映射到 Java 对象的方式。

首先你有一个数组 var data = new Array(); 。所以最初您在 JSON 中有以下内容

[]

这只是一个空数组。在 Java JSON/POJO 映射世界中,这通常映射到 Java List或纯java数组,所以你现在就拥有了

List data = new ArrayList();

然后开始添加 Javascript 对象 ( { } ),该对象映射到 JSON 对象 ( { } )。

所以在前两个添加之后,你有

[
  { name: 'field1', value: "123" },
  { name: 'field2', value: "XYZ" }
]

但是 JSON 对象 ( {..} ) 映射到 Java 对象。所以我们需要一个类来举办 namevalue字段。例如

public class KeyValuePair {
    public String name;
    public String value;
}

现在你有了一些映射到的东西

List<KeyValuePair> data = new ArrayList<>();
data.add(new KeyValuePair("field1", "123"));
data.add(new KeyValuePair("field2", "XYX"));

正如你所看到的,它开始看起来相当难看。这是因为您发送数据的方式。但正如您从 KeyValuePair 中看到的那样例如,Javascript 属性,即 namevalue映射到 Java 字段 namevalue 。因此,您应该做的就是忘记名称值对,并将 Javacript 对象直接映射到 Java 对象。例如

var obj = {
    field1: "123",
    field2: "XYZ",
    products: [
        { name: "product1", price: 10 },
        { name: "product2", price: 20 },
        { name: "product2", price: 30 }
    ]
};
var data = JSON.stringify(obj);
$.ajax({
    url:url,
    data: data,
    contentType: "application/json",
    ...
});

现在 Javacript obj会映射到 Java 就像

public class MyObject {
    public String field1;
    public String field2;
    public List<Product> products;
    // should actually be private with getters and setters
}

public class Product {
    public String name;
    public double price;
}

我希望您能看到 Javascript 如何直接映射到 Java 类。所以现在你可以简单地将其作为方法

@Path("/myRequestPath")
@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
public MetaDataStatus processChangeRequest(MyObject obj) {}

为此,您需要确保您有 Jersey 的 JSON 提供程序。如果没有,您将收到类似“未找到媒体类型 application/json 和 Java 类型 MyObject 的 MessageBodyReader”之类的异常。如果您看到此异常,您可以使用异常消息进行谷歌搜索。有很多答案显示您需要添加的内容。我可以亲自告诉你,但你没有提供足够的信息,我无法准确地告诉你你需要什么。

如果您需要帮助来解决这个问题,请告诉我您正在使用的 Jersey 版本以及您是否使用 Maven。

更新

对于 Maven,只需添加此依赖项即可支持 JSON/POJO

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.7</version>
</dependency>

然后在您的 web.xml 中进行配置

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

关于java - Jersey 消耗二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32562123/

相关文章:

java - 仅支持有限数量的语言

java - 无法启动: error in configuration file(s) Can't find setting 'Scenario.nrofHostGroups' Java Result: -1

java - 如何将复杂的java对象(嵌套映射和列表)从一个apache nifi处理器传递到另一个?

scala - Scala 或 Java 中的 --cacerts 等同于什么?

c# - 未找到其余 Azure 端点

java - Jersey 2 多部分

java - 使用jax-ws时出现问题

java - 从 html 转换为 pdf 和图像 java

java - 用于验证的 REST API 中的媒体类型

java - JAXB:泛型的多态性