Проблема Джерси с анализом 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;
}

}

И это исключение:

Кто-нибудь знает, что не так?

Прошло некоторое время с тех пор, как был задан этот вопрос, но я столкнулся с той же проблемой. Я просмотрел несколько примеров из Джерси и обнаружил различия в файлах дескрипторов развертывания web.xml. Вот что сработало для меня:


person LeonS    schedule 29.10.2010    source источник


Ответы (4)


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

    <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 1.5.

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

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

person Hendrik    schedule 11.03.2011

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

return myJsonArray.toString();

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

@Produces("application/json")

У меня была такая же проблема при использовании разных jar-файлов для 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

person Bill Goggin    schedule 24.11.2011

Не уверен, что изменилось, но когда я переключился на jackson-all-1.9.2.jar, исключение прекратилось.

JAXB не может сериализовать JSONArray и JSONObject по умолчанию.

person John    schedule 12.01.2012

Преобразование JSONArray в String - это вариант.

Есть еще один способ, который мне подходит:

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

  1. Измените объекты массива на тип карты;
  2. 29.10.2010 11:42:57 org.apache.catalina.core.StandardWrapperValve вызывает SCHWERWIEGEND: Servlet.service () для сервлета ServletAdaptor сгенерировал исключение org.codehaus.jackson.map.JsonMappingException: сериализатор не найден для класса org.codeisonhaus.jett .json.JSONArray и не обнаружено свойств для создания BeanSerializer (чтобы избежать исключения, отключите SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) в org.codehaus.jackson.map.ser.StdSerializerProvider $ 1.serialize (StdSerializerProvideus.org. .jackson.map.ser.StdSerializerProvider._serializeValue (StdSerializerProvider.java:296) в org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue (StdSerializerProvider.java:224ue) в org.codehaus.java:224ue. (ObjectMapper.java:925) в org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo (JacksonJsonProvider.java:497) в com.sun.jersey.spi.container.ContainerResponse.write (ContainerResponse.java .:299) солнце .jersey.server.impl.application.WebApplicationImpl._handleRequest (WebApplicationImpl.java:1326) в com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest (WebApplicationImpl.java:1239) в com.suner.java:1239) .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 (H.jtp: ) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:269) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:188) в org.apache.rapper.catalina. invoke (StandardWrapperValve.java:213) в org.apache.catalin a.core.StandardContextValve.invoke (StandardContextValve.java:172) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:127) в org.apache.catalina.valves.ErrorReportValve.java.invoke (ErrorReportValve.Valve. 117) на org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:108) на org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:174) на org.apache.coyote.http11.Process .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. java: 81) в org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run (ThreadPool.java:689) в java.lang.Thread.run (Thread.java:680)

Измените JSONArray на тип списка;

person Felipe Crescencio    schedule 12.11.2014