我正在尝试使用jersey框架实现Resource。 但是如果我调用我的资源,我将得到一个解析异常,解析器无法解析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)) at 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) at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925) 在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) 在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) at 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) at 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) at org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:689) 在java.lang.Thread.run(Thread.java:680)
有谁知道什么是错的?
答案 0 :(得分:3)
我是泽西的新手,但我认为如果你的方法只返回一个字符串,那么JAXB需要一种方法来序列化它。我只是让我的方法返回一个String,将我的return语句改为:
return myJsonArray.toString();
并继续使用
@Produces("application/json")
这似乎有效。在codehaus jar中可能有一个序列化器,但没有潜入寻找它。
答案 1 :(得分:2)
<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上测试了它,它也能正常运行。
答案 2 :(得分:2)
当我为jackson使用不同的罐子时遇到同样的问题:jackson-xc-1.9.2.jar:jackson-mapper-asl-1.9.2.jar:jackson-jaxrs-1.9.2.jar:jackson-芯ASL-1.9.2.jar
不确定有什么不同,但当我切换到jackson-all-1.9.2.jar时,异常停止了。
答案 3 :(得分:0)
默认情况下,JAXB无法序列化JSONArray和JSONObject。
将您的JSONArray转换为String是一个选项。
还有另一种方式对我有用:
默认情况下,JAXB序列化列表和地图,此解决方案对我来说很好。