java - 期望一个对象数组,但得到一个对象中的一个对象

标签 java json jersey tomcat8

在我目前正在处理的一个项目中,我遇到了一个角度异常:错误:[$resource:badcfg] 资源配置错误。预期响应包含一个数组但得到一个对象?

在寻找解决方案的过程中,我直接在浏览器中输入了网络服务的 URL,令人惊讶的是我没有收到预期的数组。

网络服务类:

@Path("/menu")
public class MenuHandler {
    @GET
    @Path("/cls")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Clazz> getCLSs()    {
        Clazz clazz = new Clazz();
        Clazz.setFoo("foo");
        Clazz.setBar("bar");

        ArrayList<Clazz> clazzes = new ArrayList<>();
        clazzes.add(clazz);

        return clazzes;
    }
}

当我输入 url http://localhost:8080/myProject/rest/menu/cls 时,我希望看到一个包含 JSON 对象的 JSON 数组:

[ {"foo": "foo", "bar": "bar"} ]

但是,我收到了一个 JSON 对象,它的属性是我期望的没有任何数组的 JSON 对象:

{
  "clazz": {
    "foo": "foo",
    "bar": "bar"
  }
}

所以我想知道为什么没有数组,当我添加另一个 Clazz 对象时会发生什么。在那种情况下,我仍然得到一个 JSON 对象,但这次其中一个参数是我希望从一开始就拥有的 JSON 数组。

{
  "clazz": [
    {
      "foo": "foo",
      "bar": "bar"
    },
    {
      "foo": "foo2",
      "bar": "bar2"
    }
  ]
}

有人可以向我解释为什么会发生这种行为以及我的想法哪里出了问题吗?

最佳答案

所以我发现了问题。我能够重现它。看来你只是忘了启用 POJOMappingFeature

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

这使用 Jackson 来反序列化/序列化。如果未设置,它将使用 Jersey 的内部 JSON 提供程序进行反序列化/序列化。我不确定如何配置默认提供程序,但我认为无论如何还是使用 Jackson 更安全。


此外,在我上面的评论中,我说要测试是否使用了 Jackson。轻松实现此目的的一种方法是仅创建一个 ContextResolver 和一个 s.o.p.在 getContext 方法中。当需要映射器时调用此方法。因此,如果使用 Jackson,则应该打印 s.o.p

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper defaultMapper;

    public ObjectMapperContextResolver() {
        defaultMapper = new ObjectMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        System.out.println("--- getContext ---");
        return defaultMapper;
    }  
}

请注意,这也是使用 Jackson 序列化/反序列化进行任何配置的一种方式(只需配置映射器)。

关于java - 期望一个对象数组,但得到一个对象中的一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32097870/

相关文章:

java - 从 OpenID 2.0 迁移到 OpenID Connect : cannot use the openid_id to select appengine users

json - 从 Assets 导入 Json 文件 - Angular Production Build 问题

java - 如何在 Jersey 中传递元素列表作为参数?

java - 带有 JavaME 的 org.json 在 toString() 中插入随机数

java - 在顶级关系数据库上运行ElasticSearch

rest - 单个 Jersey GET 资源所需的最低限度?

java - 找不到提供程序类 : when running Jersey REST service

java - MySQL SQL 查询 DATEDIFF 在 H2 中失败,其中模式为 MYSQL

java - 沿着具有附加要求的路径制作动画

java - 每个集群一个套接字连接