我正在编写一个Java EE REST应用程序(它在Glassfish 4.1下运行),并且在阅读简单的键值JSON列表时遇到问题。我试图使用POJO类生成和使用JSON,生产工作正常,但消耗不起作用。 让我们来看看代码。我使用的生产和消费JSON的POJO类是这样的:阅读JSON来与JAX-RS地图
public class Transport {
protected Integer id;
protected String name;
protected Map<String, String> fields;
// ...getters and setters...
}
其余资源导入这些库(我在这里把相关的):
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
的方法谁生产JSON工作正常,那就是:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("test")
public Response testGet() {
Transport sct = new Transport();
sct.setId(1);
sct.setName("test");
HashMap<String, String> t1 = new HashMap();
t1.put("aaa", "bbb");
t1.put("bbb", "ccc");
t1.put("ccc", "ddd");
sct.setFields(t1);
// createOkResponse is a class method that return Response type
return createOkResponse(sct);
}
所以我正确地获得这样的输出:
{
"id": 1,
"name": "test",
"fields": {
"aaa": "bbb",
"ccc": "ddd",
"bbb": "ccc"
}
}
谁消耗的JSON,使用相同的POJO的方法:
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("test")
public Response testPut(Transport sct) {
Map<String, String> fields = sct.getFields();
// this code throws a NullPointerException at fields.entrySet()
// because fields is always null
//for (Entry<String, String> field : fields.entrySet()) {
// LOG.log(Level.INFO, "*** field: {0} = {1}", new Object[]{field.getKey(), field.getValue()});
//}
return createOkResponse(sct);
}
消费用相同的JSON服务上面会导致与ID和name属性的SCT对象设置,但fields属性值,所以该方法的反应是:
{
"id": 1,
"name": "test",
"fields": null
}
它就像{"aaa": "bbb", "ccc": "ddd", "bbb": "ccc"}
JSON对象被忽略。我尝试过使用Google搜索,但我不明白我的代码有什么问题,并且我没有在glassfish日志中看到错误或警告。 有什么想法?谢谢。
不是100%确定,但问题可能在于MOXy(默认JSON提供程序)如何处理Google地图。您可以尝试禁用MOXY,以便Jersey使用Jackson,并查看会发生什么。尝试将属性['jersey.config.server.disableMoxyJson'](https://jersey.java.net/apidocs/2.22/jersey/org/glassfish/jersey/server/ServerProperties.html#MOXY_JSON_FEATURE_DISABLE)配置为'true '。 –
Hi @peeskillet,改变MOXY为杰克逊做的伎俩,所以谢谢你! 无论如何,有什么方法可以用MOXY阅读这个JSON吗?对我来说这似乎很奇怪,它可能会产生无法阅读的JSON。 –
你可以尝试[这也许](http://stackoverflow.com/a/29324520/2587435) –