当前位置: 首页 > 知识库问答 >
问题:

读取要与JAX-RS映射的JSON

闾丘卓
2023-03-14

我正在编写一个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日志中也没有看到任何错误或警告。知道吗?多谢了。

共有1个答案

程举
2023-03-14

您可以使用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的一个特殊性。在这个答案中可以找到解决方法。