【发布时间】:2015-11-12 21:25:45
【问题描述】:
在我目前正在进行的一个项目中,我遇到了一个角度异常: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;
}
}
当我输入 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"
}
]
}
谁能解释一下为什么会发生这种行为以及我的想法哪里出错了?
【问题讨论】:
-
请显示您使用的 JSON 提供程序、与 JSON 相关的所有依赖项以及您可能感兴趣的任何 JSON 配置。这似乎是一个配置问题。显式配置或可配置的默认配置(并且可能是固定的)。
-
@peeskillet javax.json-api 和 jersey-json-1.17.1 jar 都在这个项目的类路径中。知道如何找出实际使用的是哪一个吗?
-
我删除了他的 javax.json-api,一切似乎都正常。不幸的是,这并没有解决问题。在另一个项目中,也使用了 jersey-json 并且一切都按预期工作。我试图寻找差异,但我正在查看它。
-
查看 jersey-json 是否被使用的一种方法是创建一个
ContextResolver<ObjectMapper>。在getContext中添加打印语句。 jersey-json 使用杰克逊。如果它被使用,getContext方法将被调用。如果它没有被调用,那么它就没有被使用。在这种情况下,您可能想尝试在序列化/反序列化上触发一些异常,以尝试从序列化程序获取堆栈跟踪,以查看实际使用的序列化程序。 -
不太确定你的想法,所以我在被调用方法中创建了一个匿名类,并在 applicationContext.xml 中创建了一个单独的类。没有调用任何打印语句。不过球衣好像还是用了
at com.sun.jersey.json.impl.provider.entity.JSONListElementProvider.writeList(JSONListElementProvider.java:145) at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.writeTo(AbstractListElementProvider.java:264) at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306) at com.sun.jersey.server.impl.appl...