期望一个对象数组但在对象中得到一个对象

时间:2015-08-19 14:08:34

标签: java json jersey tomcat8

在我目前正在处理的项目中,我遇到了一个角度异常:Error: [$resource:badcfg] Error in resource configuration. Expected response to contain an array but got an object?

在我寻找解决方案的搜索中,我直接将Web服务的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;
    }
}

当我输入网址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"
    }
  ]
}

有人可以解释一下为什么会出现这种情况以及我的想法出错了吗?

2 个答案:

答案 0 :(得分:1)

所以我发现了这个问题。我能够重现它。您似乎忘了启用POJOMappingFeature

M20.0,23.0 L 30.1,89.21

这使用Jackson来反序列化/序列化。如果未设置,则使用Jersey的内部JSON提供程序进行反序列化/序列化。我不确定如何配置默认提供商,但我认为最好还是跟杰克逊一起去。

除此之外,在我上面的评论中,我说要测试杰克逊是否被使用。轻松完成此任务的一种方法是只创建一个<init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> 和一个s.o.p.在ContextResolver方法中。需要映射器时调用此方法。因此,如果使用Jackson,则应打印s.o.p

getContext

请注意,这也是使用Jackson serization / deserialization进行任何配置的方法(只需配置映射器)。

答案 1 :(得分:0)

可能您想使用GenericEntity并返回Response。

@GET
@Path("/cls")
@Produces({ MediaType.APPLICATION_JSON })
public Response getCLSs() {
    List<Clazz> objects = new ArrayList<Clazz>();
     // logic goes here

     // now wrap List into GenericEntity 
    GenericEntity<List<Clazz>> entity = new GenericEntity<List<Clazz>>(
            objects) {
    };
    return Response.ok(entity).build();
}