我正在使用 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 对象。所以我们需要一个类来举办 name
和value
字段。例如
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 属性,即 name
和value
映射到 Java 字段 name
和value
。因此,您应该做的就是忘记名称值对,并将 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/