2016-06-08 50 views
1

我正在编写一个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日志中看到错误或警告。 有什么想法?谢谢。

+0

不是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 '。 –

+0

Hi @peeskillet,改变MOXY为杰克逊做的伎俩,所以谢谢你! 无论如何,有什么方法可以用MOXY阅读这个JSON吗?对我来说这似乎很奇怪,它可能会产生无法阅读的JSON。 –

+0

你可以尝试[这也许](http://stackoverflow.com/a/29324520/2587435) –

回答

1

您可以使用XmlAdapter,如this post中所述。问题是MOXy处理地图的方式。它在底层使用JAXB,这意味着要用于XML,而XML不能很好地映射到Maps(或键/值)对。

因此,我不推荐使用Jackson,而不是使用MOXy for JSON(这是Glassfish中的默认JSON提供程序)。杰克逊也应该被纳入Glassfish 4.1。但是你需要禁用MOXY,所以Jackson可以注册。要禁用MOXy,只需将Jersey属性jersey.config.server.disableMoxyJson设置为true即可。