简体   繁体   English

解析JSONArray的Jersey问题

[英]Jersey Problem with Parsing a JSONArray

I'm trying to implement a Resource with the jersey framework. 我正在尝试使用jersey框架实现Resource。 But if I call my resource, I will get a parsing exception, that the parser can't parse JSONArray datatype. 但是,如果我调用资源,则会得到一个解析异常,即解析器无法解析JSONArray数据类型。

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.WebApplication 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,在org.codehaus上的org.codehaus.jackson.map.ser.StdSerializerProvider $ 1.serialize(StdSerializerProvider.java:62)上没有发现创建BeanSerializer的属性(为避免异常,请禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))。 org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)上的.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)在org.codehaus.jackson.map.ObjectMapper.writeValue (ObjectMapper.java:925)在org.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.WebApplication Impl._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.StandardHost com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239)处的com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(Impl._handleRequest(WebApplicationImpl.java:1326) com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)上的WebApplicationImpl.java:1229)com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java: 497),位于org.apache.catalina.core处的javax.servlet.http.HttpServlet.service(HttpServlet.java:729)处com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)的org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)的.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) org.apache.catalina.core.StandardHost上的org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) Valve.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) org.org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)的Valve.invoke(StandardHostValve.java:127)org.org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)上的.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)在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)

Does anyone knows whats going wrong? 有人知道出什么事了吗?

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. 我是Jersey的新手,但是我认为,如果您的方法返回的字符串不是字符串,则JAXB必须有一种对其进行序列化的方法。 I just had my method return a String, changed my return statement to: 我只是让我的方法返回一个String,将return语句更改为:

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. 可能在codehaus jar中有一个序列化器,但是还没有深入研究。

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. 我查看了泽西岛的一些示例,发现部署描述符的web.xml文件存在差异。 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. 不知道这是一个错误还是不同的Jersey Servlet类之间的区别。 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. 也是为了记录在这种情况下:我使用的是Jersey 1.5。

UPDATED: Just tested this on Jersey 1.11, and it works as well. 更新:刚刚在Jersey 1.11上进行了测试,它也可以正常工作。

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 当对杰克逊使用不同的jar时,我遇到了同样的问题: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. 不知道有什么不同,但是当我切换到jackson-all-1.9.2.jar时,异常停止了。

JAXB cant serialize JSONArray and JSONObject by default. 默认情况下,JAXB无法序列化JSONArray和JSONObject。

Transform your JSONArray to a String is an option. 将您的JSONArray转换为字符串是一种选择。

There is another way that works fine to me: 还有一种对我有效的方法:

  1. Change the JSONArray to a List type; 将JSONArray更改为List类型;
  2. Change your array objects to a Map type; 将数组对象更改为Map类型;

JAXB serialize Lists and Maps by default, this solution works fine to me. JAXB默认情况下序列化Lists和Maps,这个解决方案对我来说很好。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM