wake-up-neo.net

SEVERE: Ein Nachrichtentextsteller für die Java-Klasse Java.util.ArrayList und MIME-Medientyp application/json wurde nicht gefunden

Ich teste REST-fähige Dienste, und wenn ich ausführe, erhalte ich Ausnahmen, obwohl ich die folgenden Gläser in meinem Klassenpfad (WEB-INF/lib) habe. Ich verwende Maven nicht und meine JDK-Version ist 1.5. Andere Fragen zu diesem Problem haben nicht dazu beigetragen, das Problem zu lösen.

Code-Auszug

@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>

Liste der Gläser

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

Ausnahmestapel

 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)

Wie kann ich dieses Problem lösen?

15
Jåcob

Stellen Sie sicher, dass Sie nicht mehrere Jersey-Versionen in Ihrem Projekt haben. Aus der Liste, die Sie zur Verfügung gestellt haben, gibt es Module aus drei verschiedenen Versionen (1.2, 1.10, 1.8). Bei einigen Modulen überprüft Jersey, ob die Version eines Moduls mit der Version des Kerns übereinstimmt. Ist dies nicht der Fall, werden die Anbieter des Moduls (z. B. MessageBodyReaders, MessageBodyWriters) nicht zur Laufzeit registriert. Dies kann ein Problem in Ihrem Setup sein - json vs core (1.8 vs 1.2).

7
Michal Gajdos

Das Problem kann sein, wie Sie versuchen, Ihr Ergebnis zurückzugeben. Ich habe gesehen, wie andere Benutzer ihren Service-Layer-Code auf diese Weise schreiben, aber Jersey bietet eine Möglichkeit, dies sauber zu tun, und es wird JSON-, XML- und HTML-Ausgabe unterstützen, die Sie nur mit Ihrer @Produces annotation angeben müssen. Das ist was ich mache:

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();
}

Ich verwende folgende Jersey-Bibliotheken:

  • jersey-core-1.8.jar
  • jersey-json-1.8.jar
  • jersey-server-1.8.jar
14
Russ Bateman

Sie können die Antwort Xml nicht als List<Emp> definieren, da die JAXB den @XmlRootElement nicht über die Klassendefinition Java.util.List oder Java.util.ArrayList identifizieren kann.

Idealerweise sollten Sie über ein übergeordnetes Element/Stammelement für Ihre Sammlung untergeordneter Elemente verfügen.

Erstellen Sie eine weitere Klasse als Employees, in der die Sammlung von Emp-Objekten enthalten ist (siehe unten), und versuchen Sie es.

@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
}

Bitte versuchen Sie diesen Ansatz, es wird funktionieren.

8
omega

Fügen Sie dies Ihrer pom.xml hinzu. Mein Problem gelöst.

        <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>
6
Michiel

Angabe von @XmlRootElement(name = "yourclass") für die Klasse, die Sie als Ausgabe übergeben möchten. Dies hat das Problem für mich gelöst, wenn ich diese Ausnahme bekomme.

3

Sie müssen den Parameter im servlet container des Trikots wie folgt angeben:

'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>
1
Maiga

Ich hatte das gleiche Problem.

Die Sache ist, dass es weiß, wie es mit der Annotation @XmlRootElement in XML konvertiert werden kann, aber es kann nicht in JSON konvertiert werden. 

Damit wir alles mit der gleichen Annotation von XML (dh @XmlRootElement) in JSON konvertieren können, können wir hinzufügen 

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

oder für maven benutzer

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

Auch sollte es keinen Argumentkonstruktor haben

1
padippist

wenn Sie Ihre Pojo-Klasse nicht überprüfen, wird die JAXBinding möglicherweise nicht ausgeführt, wenn Sie sie nicht mit @XmlRootElement markieren

1
Niraj singh