解析 JSONArray 时出现的 Jersey 问题

发布于 2024-09-30 02:51:22 字数 3603 浏览 1 评论 0原文

我正在尝试使用球衣框架实现资源。 但是如果我调用我的资源,我会得到一个解析异常,解析器无法解析 JSONArray 数据类型。

这是我的资源结构:

@Path("/books")
@Consumes("application/json")
public class BookResource {

@GET
@Produces("application/json")
public JSONArray getAllBooksOfCurrentUser() {
    Book book = new Book();
    book.initDummyBook();
    JSONArray books = new JSONArray();
    Page page = new Page();
    page.setBook(book);
    page.setNumber(22);
    ReadStatistic readStatistic = new ReadStatistic();
    readStatistic.setLastReadAt(new Date());
    readStatistic.setLastPageRead(page);
    books.put(book.simpleRepresantationWithLastReadAsJson(readStatistic));
    return books;
}

}

这是例外:

29.10.2010 11:42:57 org.apache.catalina.core.StandardWrapperValve 调用 SCHWERWIEGEND:Servlet ServletAdaptor 的 Servlet.service() 引发异常 org.codehaus.jackson.map.JsonMappingException:找不到类 org.codehaus.jettison.json.JSONArray 的序列化器,并且没有发现创建 BeanSerializer 的属性(为避免异常,请禁用 SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) 在 org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62) 在 org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296) 在 org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224) 在 org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925) 在 org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:497) 在 com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:299) 在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1326) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229) 在 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420) 在com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497) 在com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) 在 org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 在 org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 在 org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 在 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 在 java.lang.Thread.run(Thread.java:680)

有谁知道出了什么问题?

I'm trying to implement a Resource with the jersey framework.
But if I call my resource, I will get a parsing exception, that the parser can't parse JSONArray datatype.

Here's my resource structure:

@Path("/books")
@Consumes("application/json")
public class BookResource {

@GET
@Produces("application/json")
public JSONArray getAllBooksOfCurrentUser() {
    Book book = new Book();
    book.initDummyBook();
    JSONArray books = new JSONArray();
    Page page = new Page();
    page.setBook(book);
    page.setNumber(22);
    ReadStatistic readStatistic = new ReadStatistic();
    readStatistic.setLastReadAt(new Date());
    readStatistic.setLastPageRead(page);
    books.put(book.simpleRepresantationWithLastReadAsJson(readStatistic));
    return books;
}

}

And this is the exception:

29.10.2010 11:42:57 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet ServletAdaptor threw exception
org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.codehaus.jettison.json.JSONArray and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )
at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:497)
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:299)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1326)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:680)

Does anyone knows whats going wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

谎言月老 2024-10-07 02:51:22

我是 Jersey 的新手,但我认为如果您的方法返回除字符串以外的任何内容,则 JAXB 需要有一种方法来序列化它。我只是让我的方法返回一个字符串,将我的返回语句更改为:

return myJsonArray.toString();

并继续使用

@Produces("application/json")

这似乎有效。 codehaus jar 中可能有一个序列化器,但尚未深入寻找它。

I'm new to Jersey, but I think if your method returns anything but a String, there needs to be a way for JAXB to serialize it. I just had my method return a String, changed my return statement to:

return myJsonArray.toString();

and continued to use the

@Produces("application/json")

This seemed to work. There's probably a serializer in the codehaus jar, but haven't dived into looking for that.

ペ泪落弦音 2024-10-07 02:51:22

提出这个问题已经有一段时间了,但我刚刚遇到了同样的问题。我查看了一些 Jersey 示例,发现部署描述符的 web.xml 文件存在差异。这对我有用:

    <servlet-class>com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.example.your.resources</param-value>
    </init-param>

不知道这是否是一个错误,甚至不知道不同 Jersey servlet 类之间有什么区别。只是想将(一些?)答案放在这里以供记录。

也仅供记录:在本例中我使用 Jersey 1.5。

更新:刚刚在 Jersey 1.11 上测试过,它也有效。

its been a while since this question was posed but I just ran across the same problem. I looked over some Jersey examples and found differences in the deployment descriptors' web.xml files. This is what worked for me:

    <servlet-class>com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.example.your.resources</param-value>
    </init-param>

No idea if this is a bug or even what the differences are between the different Jersey servlet-classes. Just wanted to place the (some?) answer here for the record.

And also just for the record: In this case I used Jersey 1.5.

UPDATED: Just tested this on Jersey 1.11, and it works as well.

随遇而安 2024-10-07 02:51:22

当使用杰克逊的不同罐子时,我遇到了同样的问题: jackson-xc-1.9.2.jar: jackson-mapper-asl-1.9.2.jar: jackson-jaxrs-1.9.2.jar: jackson-core-asl -1.9.2.jar

不确定有什么不同,但是当我切换到 jackson-all-1.9.2.jar 时,异常停止了。

I had this same problem when using the different jars for jackson: jackson-xc-1.9.2.jar: jackson-mapper-asl-1.9.2.jar: jackson-jaxrs-1.9.2.jar: jackson-core-asl-1.9.2.jar

Not sure what is different but when I switched to jackson-all-1.9.2.jar, the exception stopped.

燃情 2024-10-07 02:51:22

默认情况下,JAXB 无法序列化 JSONArray 和 JSONObject。

将 JSONArray 转换为字符串是一种选择。

还有另一种方法对我来说效果很好:

  1. 将 JSONArray 更改为 List 类型;
  2. 将数组对象更改为 Map 类型;

默认情况下,JAXB 序列化列表和映射,这个解决方案对我来说效果很好。

JAXB cant serialize JSONArray and JSONObject by default.

Transform your JSONArray to a String is an option.

There is another way that works fine to me:

  1. Change the JSONArray to a List type;
  2. Change your array objects to a Map type;

JAXB serialize Lists and Maps by default, this solution works fine to me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文