我正在编写一个Java EE REST应用程序(它在Glassfish 4.1下运行),但在读取一个简单的键值JSON列表时遇到了问题。我试图使用POJO类生成和消费JSON,生成工作很好,但消费不起作用。让我们来看看密码。我用于生产和消费JSON POJO类如下所示:
public class Transport {
protected Integer id;
protected String name;
protected Map<String, String> fields;
// ...getters and setters...
}
REST资源导入了这些库(我在这里提供了相关的库):
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"
}
}
使用相同的POJO使用JSON的方法:
@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使用服务将导致sct对象设置了id和name属性,但fields属性为null,因此方法的响应是:
{
"id": 1,
"name": "test",
"fields": null
}
这就像{“aaa”:“bbb”,“ccc”:“ddd”,“bbb”:“ccc”}
JSON对象被忽略一样。我试着搜索了一下,但我不明白我的代码出了什么问题,在glassfish日志中也没有看到任何错误或警告。知道吗?多谢了。
您可以使用XMLAdapter
,如本文所述。问题是MOXy处理地图的方式。它暗中使用了JAXB,而JAXB本来是用于XML的,而XML不能很好地映射到映射(或键/值)对。
出于这个原因,我将推荐使用Jackson而不是使用MOXy For JSON(这是Glassfish中默认的JSON提供程序)。杰克逊也应该包括在Glassfish 4.1中。但是你需要禁用MOXy,这样杰克逊就可以自己注册了。要禁用MOXy,只需将Jersey属性Jersey.config.server.DisableMoxyJSON
设置为true
。
问题内容: 我已经读过我可以创建一个实现,将抛出的应用程序异常映射到对象。 我创建了一个简单的示例,如果在保留对象时电话长度大于20个字符,则会引发异常。我期望将异常映射到HTTP 400(错误请求)响应;但是,我收到HTTP 500(内部服务器错误),但有以下异常: 我想念什么?任何意见是极大的赞赏。 异常映射器: 异常类: 实体类: 服务: 问题答案: InvalidDataException
问题内容: 我真的很困惑。我已经尝试过使用tomcat的Jax-rs并使用所有能够使用调用我的服务的注释。因此,没有Jax- rs,我可以简单地拥有一个servlet并调用我的服务。同样,正如我尝试过的那样,有jax-rs和jersey(我研究了的实现)以及web.xml中的以下内容。 然后,我在GET上具有与JAX-RS相同的注释,可以使用正确的URL调用我的服务。 我的问题是,为什么球衣使用s
什么是resteasy?RESTEasy和JAX-RS有什么区别?和之间有什么区别?
我有一个基本的REST web服务可以工作,但我确实有一个问题。下面是一个简短的代码片段。
JAX-RS (JSR 311) 是一个社区驱动的标准用于使用 Java 构建 RESTful Web 服务。
多值映射不存在的原因是什么?会不会是什么过滤?对于未知数量的参数,有什么可供选择的? 更新是由于泽西+Spring的一个特殊性。在这个答案中可以找到解决方法。