2010-10-29 33 views
0

我试图用泽西框架实现一个资源。 但是,如果我打电话给我的资源,我会得到解析异常,解析器无法解析JSONArray数据类型。泽西问题解析一个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的Servlet.service()ServletAdaptor抛出异常 org.codehaus.jackson.map.JsonMappingException:找不到类org.codeha的序列化程序us.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) 在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.ApplicationFilterCha (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) 在有机apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:689) 在java.lang.Thread.run(Thread.java:680)

有谁知道什么回事?

回答

2

它已经有一段时间了,因为这个问题提出了,但我只是遇到了同样的问题。我查看了一些泽西岛的例子,发现部署描述符的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> 

不知道如果这是一个错误,甚至什么样的差异是不同的球衣servlet的类之间。只是想把(某些?)答案放在这里作为记录。

也只是为了记录:在这种情况下,我用泽西岛1.5。

更新:刚刚在泽西岛1.11测试了它,它的工作原理也是如此。

3

我是新来的泽西岛,但我认为如果你的方法返回的只是一个字符串,那么需要有一种方法让JAXB序列化它。我有我的方法返回一个字符串,改变了我的return语句:

return myJsonArray.toString(); 

,并继续使用

@Produces("application/json") 

这似乎工作。 codehaus jar中可能有一个序列化程序,但并没有潜心寻找。

2

我在使用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

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

0

默认情况下JAXB不能序列化JSONArray和JSONObject。

将您的JSONArray转换为字符串是一个选项。

有工作正常对我的另一种方式:

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

JAXB默认序列化List和Maps,这个解决方案对我来说工作正常。