СЕРЬЕЗНО: средство записи тела сообщения для класса Java java.util.ArrayList и MIME media type application / json не найдено

Я тестирую службы RESTful, и когда я выполняю, я получаю исключения, хотя у меня есть следующие банки в моем пути к классам (WEB-INF / lib), я не использую Maven, а моя версия JDK - 1.5. Другие вопросы по этой проблеме не помогли решить проблему.

Фрагмент кода

@GET
@Produces("application/json")    
//@Produces({MediaType.APPLICATION_JSON}) tried this, didn't work either
public List<Emp> getEmployees() {        
    List<Emp> empList = myDAO.getAllEmployees();
    log.info("size   " + empList.size());
    return empList;
}

@XmlRootElement
public class Emp {
......

web.xml

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>test.employees</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

 <servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Список банок

jersey-server-1.2.jar
jersey-core-1.2.jar
jsr311-api-1.1.jar
asm-3.1.jar
jaxb-api-2.0.jar
jaxb-impl-2.0.jar
jackson-xc-1.2.0.jar
jackson-jaxrs-1.2.0.jar
jackson-mapper-asl-1.2.0.jar
jackson-core-asl-1.2.0.jar
jettison-1.2.jar
jersey-client-1.2.jar
jersey-servlet-1.10.jar
jersey-json-1.8.jar

Стек исключений

 SEVERE: A message body writer for Java class java.util.ArrayList,
 and Java type java.util.List<test.Emp>, 
 and MIME media type application/json was not found
Nov 21, 2013 11:47:26 AM com.sun.jersey.spi.container.ContainerResponse traceException
SEVERE: Mapped exception to response: 500 (Internal Server Error)

javax.ws.rs.WebApplicationException
    at javax.ws.rs.WebApplicationException.<init>(WebApplicationException.java:97)
    at javax.ws.rs.WebApplicationException.<init>(WebApplicationException.java:55)
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:267)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1035)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:947)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:939)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:399)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:478)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:663)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:719)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:376)
    at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:870)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:451)
    at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:218)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:119)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:230)
    at oracle.oc4j.network.ServerSocketAcceptHandler.access$800(ServerSocketAcceptHandler.java:33)
    at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:831)
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
    at java.lang.Thread.run(Thread.java:595)

Как я могу решить эту проблему?


person Jacob    schedule 21.11.2013    source источник
comment
Обновите jar-файлы, связанные с майкой, до версии 1.17. Получите пакет отсюда jersey.java.net/download.html   -  person Ian Lim    schedule 21.11.2013
comment
@mallim jersey bundle 1.17 совместим с JDK1.5?   -  person Jacob    schedule 21.11.2013
comment
Обратитесь к [этой ссылке] [1], где объясняется решение проблемы аналогичного типа. [1]: stackoverflow.com/a/13439840/4469988   -  person Raju Rao    schedule 03.02.2015


Ответы (9)


Убедитесь, что в вашем проекте нет нескольких версий Jersey. Из предоставленного вами списка есть модули трех разных версий (1.2, 1.10, 1.8). Для некоторых модулей Джерси проверяет, совпадает ли версия модуля с версией ядра. Если это не так, поставщики модуля (такие как MessageBodyReaders, MessageBodyWriters) не регистрируются во время выполнения. Это может быть проблемой в вашей настройке - json vs core (1.8 vs 1.2).

person Michal Gajdos    schedule 21.11.2013
comment
Михал относительно последнего упомянутого вами моста, т.е. я пробовал с json jersey-json 1.2 и jersey-core-1.2, но проблема не устранена. Мне нужно попробовать ваш первый пункт, однако я смог найти версию 1.2 jersey-servlet. С утра пытаюсь решить эту проблему, но безуспешно. - person Jacob; 21.11.2013
comment
И Михал, не могли бы вы подсказать, какие правильные версии всех jar-файлов требуются для работы на JDK1.5? Спасибо - person Jacob; 21.11.2013
comment
В 1.2 нет jersey-servlet (этот модуль был введен ~ 1.9). Вся функциональность должна быть в jersey-server. Также я не думаю, что поддержка функции сопоставления POJO (com.sun.jersey.api.json.POJOMappingFeature) есть в 1.2, что может означать, что пользовательский парсер json не может обрабатывать List<Emp>. Можно попробовать хотя бы на 1.9 перейти? - person Michal Gajdos; 21.11.2013
comment
Значит, вы хотите сказать, что я должен попробовать 1.9 jersey-server вместо 1.2? Если да, я должен использовать все 1.9 версии, кроме jersey-servlet? - person Jacob; 21.11.2013
comment
Я хотел использовать 1.9 для всех модулей Джерси (+ вы сможете использовать Jackson для Java ‹-› JSON, который должен поддерживать List ‹Emp›). Также предложение от @omega может быть действительным для некоторых парсеров JSON. - person Michal Gajdos; 21.11.2013
comment
Версия 1.9 несовместима с версией JDK1.5. - person Jacob; 21.11.2013
comment
Михал, как обходной маневр, я избегал использования @Produces("application/json") и вручную переносил json-метод во все, что я возвращаю из базы данных, и возвращаюсь к вызову метода REST. Для этого подхода мой тип метода - String или Object. Например. public String getEmployees() { ...... String myjson = gsons.toJson(empList); return myjson; Надеюсь, это соответствует стандарту или архитектуре REST. - person Jacob; 21.11.2013

Проблема может заключаться в том, как вы пытаетесь вернуть результат. Я видел, как другие пишут свой код уровня сервиса таким же образом, но Джерси предоставляет способ сделать это чисто, и он будет поддерживать вывод JSON, XML и HTML, который вам нужно только указать с помощью вашего @Produces аннотация. Вот что я делаю:

import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.Response;

@GET
@Produces( MediaType.APPLICATION_JSON )
public Response getEmployees()
{        
    List< Emp >                  matched;
    GenericEntity< List< Emp > > entity;

    matched = myDAO.getAllEmployees();
    entity  = new GenericEntity< List< Emp > >( matched ) { };

    return Response.ok( entity ).build();
}

Я использую следующие библиотеки Джерси:

  • jersey-core-1.8.jar
  • Джерси-json-1.8.jar
  • Джерси-сервер-1.8.jar
person Russ Bateman    schedule 04.04.2014

Вы не можете определить ответ Xml как List<Emp>, поскольку JAXB не может идентифицировать @XmlRootElement по определению класса java.util.List или java.util.ArrayList.

В идеале у вас должен быть один родительский / корневой элемент для вашей коллекции дочерних элементов.

Создайте еще один класс как Employees, чтобы он содержал коллекцию объектов Emp, как показано ниже, и попробуйте его.

@GET
@Produces("application/json")    
public Employees getEmployees() {        
    List<Emp> empList = myDAO.getAllEmployees();
    log.info("size   " + empList.size());
    Employees employees = new Employees();
    employees.setEmployeeList(empList);

    return employees;
}

@XmlRootElement(name = "Employees")
public class Employees {

    List<Emp> employeeList;

    //setters and getters goes here
}

@XmlRootElement()
class Emp {
   //fields here
}

Пожалуйста, попробуйте этот подход, он сработает.

person omega    schedule 21.11.2013
comment
Я пробовал ваш подход, но все же у меня такие же ошибки. Та же настройка того, что у меня уже есть, и те же версии банок. - person Jacob; 21.11.2013

Добавьте это в свой pom.xml. Решил мою проблему.

        <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.18.1</version>
    </dependency>
    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.99</version>
    </dependency>
person Michiel    schedule 22.10.2015

Указание @XmlRootElement(name = "yourclass") в классе, который вы хотите передать в качестве вывода. Это решило для меня проблему, когда я получил это исключение.

person Ramjiraju Kammila    schedule 07.01.2017
comment
Я не верил, что это может решить проблему, поскольку аннотация связана с JSON, а не с XML, но она сработала !, вы сделали мой день, большое спасибо - person Bassel Kh; 28.11.2017
comment
то же самое! что он сказал! ^ - person Victor Ramos; 02.02.2018

У меня такая же проблема.

Дело в том, что он знает, как преобразовать его в xml с аннотацией @XmlRootElement, но не знает, как преобразовать его в JSON.

Поэтому, чтобы преобразовать все в JSON с той же аннотацией xml (т.е. @XmlRootElement), мы можем добавить

jersey-media-moxy-<whatever version>.jar

или для пользователей maven

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

Также он не должен иметь конструктора аргументов

person padippist    schedule 11.12.2017

Вы должны указать в servlet container jersey следующий параметр:

'com.sun.jersey.api.json.POJOMappingFeature' like this: 
 <servlet>
    <servlet-name>myServices</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>services</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
person Maiga    schedule 16.12.2017

перекрестная проверка вашего класса pojo может не выполняться JAXBinding, если не выполнено, отметьте ваше pojo с помощью @XmlRootElement

person Niraj singh    schedule 26.09.2018

У меня была такая же проблема. Тогда я решил это.

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>aaa</groupId>
    <artifactId>aaa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>

    </build>
    <dependencies>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.18.1</version>
        </dependency>
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>0.99</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.7.3</version>
        </dependency>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-bundle</artifactId>
            <version>1.19.4</version>
        </dependency>
    </dependencies>
</project>

Мой метод здесь.

public static void postData() {
    Staff staff = new Staff();
    staff.setStaffname("Celal");                staff.setStafflastname("Aygar");
    staff.setEmail("[email protected]");    staff.setGender("Male");
    staff.setCity("DENIZLI");
    String uri = "http://localhost:8185/staff";
    ClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
    Client client = Client.create(clientConfig);
    WebResource resource = client.resource(uri);
    try {
        ClientResponse response = resource.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)
                .post(ClientResponse.class, staff);
        if (response.getStatus() == 200) System.out.println("Staff detail : " + response.getEntity(Staff.class));
    } catch (Exception e) { System.out.println("Exception is:" + e.getMessage()); }
}

Моя сущность здесь.

@XmlRootElement()
public class Staff {
    private Long staffid;

    private String staffname;
    private String stafflastname;
    private String gender;
    private String email;
    private String city;

    //getter setter toString

}
person Hacı Celal Aygar    schedule 11.03.2020