wake-up-neo.net

Jersey + Json Medientyp Anwendung/Json wurde nicht gefunden

Ich versuche es mit einem einfachen Jersey + JSON-Beispiel, ich erhalte jedoch die folgende Fehlermeldung message body writer for Java class com.test.jsonexample and MIME media type application/json was not found

Ich stelle folgende JAR-Dateien ein, um das entsprechende Ergebnis zu erhalten 

asm-3.1.jar
jackson-core-asl-1.9.9.jar
jackson-jaxrs-1.9.9.jar
jackson-mapper-asl-1.9.9.jar
jackson-xc-1.9.9.jar
jersey-client-1.9.jar
jersey-core-1.9.1.jar
jersey-json-1.9.jar
jersey-server-1.9.1.jar
jettison-1.3.2.jar
jsr311-api-1.1.1.jar

Warum erhalte ich diese Art von Fehler? Das Fehlerprotokoll ist hier:

SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
    at com.Sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.Java:285)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.Java:1437)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1349)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1339)
    at com.Sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.Java:416)
    at com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:537)
    at com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:708)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:225)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:168)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:98)
    at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:927)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:407)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1001)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:579)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:312)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at Java.lang.Thread.run(Unknown Source)

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://Java.Sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>TestJaxRs</display-name>

    <servlet>
        <servlet-name>jersey-serlvet</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>com.test.rest</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>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

JsonExample.Java

@XmlRootElement  
public class JsonExample {

    String title;
    String singer;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSinger() {
        return singer;
    }

    public void setSinger(String singer) {
        this.singer = singer;
    }

    @Override
    public String toString() {
        return "JsonExample [title=" + title + ", singer=" + singer + "]";
    }

}

und der Json-Service 

@Path("/json/metallica")
public class JSONService {

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON)
    public JsonExample getTrackInJSON() {

        JsonExample json = new JsonExample();
        json.setTitle("Enter Sandman");
        json.setSinger("Metallica");

        return json;

    }

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createTrackInJSON(JsonExample track) {

        String result = "Track saved : " + track;
        return Response.status(201).entity(result).build();
    }

Bitte schlage mich vor, wenn ich etwas falsch mache.

16
Ajay

Dieses Problem wurde mit Jersey-Bundle-1.8.jar behoben

13
Ajay

Problem behoben, indem Folgendes zu meiner pom.xml hinzugefügt wurde:

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.99</version>
    </dependency>

Die Dokumentation finden Sie unter: https://code.google.com/p/genson/

7
wingman88

Wenn Ihr @POST-Webservice eine Antwort zurückgibt, müssen Sie zunächst die @Produces-Anmerkung hinzufügen.

Stellen Sie sicher, dass sich jersey-json lib in Ihrem Klassenpfad befindet .. __ Versuchen Sie, die toString()-Methode zu entfernen, da das Beans-Strukturformat möglicherweise beschädigt wird.

4
Alex Stybaev

Fügen Sie die folgende Abhängigkeit hinzu, um das Problem zu lösen 

"javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
    at com.Sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.Java:285)"

Lösung:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.18</version>
</dependency>
3
Hari

Wenn Sie nicht an jackson gebunden sind, können Sie die Genson-Bibliothek http://owlike.github.io/genson/ ..__ ausprobieren. Sie benötigen nur die lib in Ihrem Klassenpfad und alles sollte ohne zusätzlichen Code funktionieren. Sie müssen nicht einmal POJOMappingFeature in web.xml verwenden oder @XMLRootElement in Ihrem Pojo hinzufügen!

Sie können auch Instanzen von Genson mit speziellen Konfigurationen mithilfe von Jersey-Mechanismen (ContextResolver) injizieren.

3
eugen

Ich habe es mit 'com.Sun.jersey:jersey-bundle:1.19' versucht und es nicht gelöst. 

Das Festlegen der Abhängigkeit von genson wurde für mich behoben. 

runtime(
        'com.owlike:genson:0.99'
)
3
dexter2305

Ich habe buchstäblich 4 Tage damit verbracht und nachdem ich stundenlang gegoogelt hatte, warum mein POST überhaupt nicht funktioniert hat. Ich erhielt diesen Fehler sowie andere Fehler, die mit MOXY zu tun hatten, wie z. B. der Fehler classdefnotfound, da Leute auf stackoverflow die Verwendung von MOXY anstelle von Jackson vorschlagen. Ich habe auch die Genson-Bibliothek ausprobiert, die auch keinen Unterschied machte. 

Ich habe MOXY komplett entfernt und nur Jackson behalten. Nach Stunden fand ich endlich die Lösung, die mich aufgrund der Einfachheit etwas ärgerte. Mein Arbeitsbereich ist in mehrere verschiedene Projekte unterteilt, eines für die Webapplikation, die web.xml enthält, und eines für die RESTful-API.

Ich betreibe auch Jersey 2, was ein weiteres Problem war, da viele der akzeptierten Antworten für dieses Problem nur über Jersey 1 sprachen und es war sehr verwirrend, als ich zum ersten Mal versuchte, dieses Problem zu lösen.

Nach stundenlangen Versuchen kam es dazu (mit der im OP geposteten Code-Struktur):

  1. Sie MÜSSEN @XmlRootElement oben in Ihre POJO-Klasse einschließen, im Gegensatz zu vielen der Beispiele in stackoverflow, die dies scheinbar wegzulassen scheinen.

  2. Sie MÜSSEN das Folgende sowohl in das Projekt einschließen, das Ihre web.xml enthält, als auch in das Projekt, das Ihren REST - Dienst und die zugehörigen Klassen enthält. Ändern Sie die Version, die für die von Ihnen verwendete Jersey-Version relevant ist.

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.5.1</version>
    </dependency>
    

Das ist es. Sie müssen nichts anderes als diese und die relevanten Jersey-Bibliotheken hinzufügen, die Sie verwenden.

Ich hoffe sehr, dass dies jemandem hilft, Stunden zu sparen, die versuchen, dies zu beheben. 

2
Toofy

Ich hatte das gleiche Problem und es wurde behoben, indem alle Json-Abhängigkeiten entfernt und .__ hinzugefügt wurde. com.owlike genson 0,99

1
user1996855

Ich weiß, dass dies eine alte Frage ist, aber ich bin auf diese Probleme gestoßen und habe alle oben genannten Lösungen ausprobiert, aber leider hat mir keiner von ihnen geholfen. Was ich fand, war, dass die Klasse MediaType in zwei verschiedenen Gläsern definiert wurde Beim Bau des Gefäßes wurde die Klasse verwendet, die in der anderen Klasse definiert wurde (in meinem Fall Glasfischglas) . Nachdem das andere Gefäß entfernt wurde (Sie können auch den bestimmten Teil ausschließen), wurde das Problem gelöst

1
Inbal

Bei der Verwendung von Jersey-Bundle-1.19.1.jar (Nicht-Maven) musste ich Folgendes entfernen:

<init-param>
  <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
  <param-value>true</param-value>
</init-param>

aus der Datei web.xml. 

Ich weiß, dass die Dokumentation diesen Abschnitt als notwendig erachtet, aber überraschenderweise war dies ein Grund für das Problem.

1
jakucki

Wenn Sie Probleme mit der Abhängigkeit von Maven haben, finden Sie hier eine gute offizielle Referenz: https://jersey.Java.net/documentation/latest/modules-and-dependencies.html#d0e383 ( Abschnitt 2.3.1, 2.3.2)

Und auch hier ist ein gutes Tutorial für die Installation von maven und tuto von Jersey in Eclipse: http://javaposts.wordpress.com/2012/01/14/maven-rest-jersey-Eclipse-tutorial/

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
<!-- if you are using Jersey client specific features -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
0
dellgg

Ich habe versucht, die folgenden Jar-Bibliotheken herunterzuladen:

Wenn ich gson 0.99 herunterlade, funktioniert mein Ruhe-Service gut.

0
jorge santos

Fügen Sie diese Abhängigkeiten in Ihre POM.xml ein und führen Sie Maven -> Update aus

<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>
0
borchvm

Überprüfen Sie auch den tatsächlichen Typparameter der Post-Methode.

Da ich auch eine Abhängigkeit von Gson hatte, sollte ich JSONObject (Jettison von Jersey-Json) anstelle von JsonObject (Gson) verwenden, was zu derselben Ausnahme führte.

0
user2657714