2010-10-29 4 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 invoke SCHWERWIEGEND: 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) на org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo (JacksonJsonProvider.java:497) на com.sun.jersey.spi.container.ContainerResponse.write (ContainerResponse.java:299) at 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) 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 in.doFilter (ApplicationFilterChain.java:188) at 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) в орг. 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> 

Не знаю, если это ошибка или даже то, что различия между различными Джерси сервлет-классы. Просто хотел поместить (некоторые?) Ответ здесь для записи.

А также для записи: в этом случае я использовал Джерси 1,5.

ОБНОВЛЕНО: Протестировано это только на Джерси 1.11, и оно также работает.

3

Я новичок в Джерси, но я думаю, что если ваш метод возвращает что-либо, кроме строки, для JAXB должен быть способ его сериализации. Я только что мой метод возвращает строку, изменил мое возвращение заявление:

return myJsonArray.toString(); 

и продолжали использовать

@Produces("application/json") 

Это, казалось, работать. Вероятно, в банке Codehaus есть сериализатор, но он не погрузился в это.

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 в String - это опция.

Существует еще один способ, который отлично работает для меня:

  1. Изменение JSONArray к типу List;
  2. Измените объекты массива на тип карты;

JAXB Сериализованные списки и карты по умолчанию, это решение отлично работает для меня.

Смежные вопросы