2015-05-24 4 views
7

Ich verwende eine JAX-RS-Webanwendung mit Jersey und Tomcat. Get-Anfragen sind in Ordnung, aber wenn ich versuche, JSON zu posten, bekomme ich einen HTTP-Status 415 - Nicht unterstützter Medientyp.POST zu Jersey REST-Dienst wird fehlerhaft 415 Nicht unterstützter Medientyp

Hier ist meine einfache HelloWorld.java:

package service; 

import javax.ws.rs.*; 

@Path("hello") 
public class HelloWorld { 
    @GET 
    @Produces("text/plain") 
    public String get() { 
     return "hello world"; 
    } 

    @POST 
    @Consumes("application/json") 
    public String post(JS input) { 
     return input.hello; 
    } 

    public static class JS { 
     public String hello; 
    } 
} 

Hier ist die Bitte, die ich in Postman versuchen (mit 'application/json' Header):

enter image description here Hier wird das Projekt-Layout mit Bibliotheken : enter image description here

ich verwende:

  • Java 7 x64
  • Jersey 2,17
  • Tomcat 7.0.62 x64

Dank!

Antwort

29

Die Jersey-Distribution kommt nicht mit JSON/POJO-Unterstützung aus der Box. Sie müssen die Abhängigkeiten/Jars hinzufügen.

Fügen Sie alle diese

Mit Maven, wird unten ziehen alle oben in

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

Für alle zukünftigen Leser mit Jersey nicht 2,17 (und Gläser mit direkt anstelle von Maven), können Sie here gehen Finden Sie die von Ihnen verwendete Jersey-Version und sehen Sie, welche transitiven Abhängigkeitsversionen Sie benötigen. Die aktuelle Version dieser Jersey Abhängigkeit verwendet Jackson 2.3.2. Das ist die Hauptsache, auf die Sie achten müssen.

+2

könnte es Probleme, weil er mit Kater statt Glasfisch? – sschrass

+0

Ich habe die Gläser zu lib hinzugefügt. Ich erhalte jetzt den Fehler 'java.lang.NoClassDefFoundError: org/glassfish/jersey/message/filtering/EntityFilteringFeature' beim Starten von Tomcat. Hilfe? –

+0

Fügen Sie einfach die Abhängigkeit in Ihrer Pom-Datei hinzu, wie oben von peeskillet vorgeschlagen. – hemant

0

Ich denke, Sie Post-Anfrage funktioniert ordnungsgemäß, aber Ihr Browser/Postbote kann nicht die Antwort von dem Dienst analysiert. Es gibt Text zurück und Postman wartet json. Fügen Sie Ihrem Webservice die Annotation Produce hinzu und legen Sie sie ebenfalls auf json fest. Ich empfehle Ihnen auch, sich mit Fiddler2 in Verbindung zu setzen, um zu sehen, welche Informationen über die Leitung gehen.

1

Überprüfen Sie Ihren REST-Aufruf contentType. Es sollte sein contentType: 'application/json', wenn Sie Json-Daten an die POJO-Klasse übergeben.

0

Durch eine Menge der Antworten sowohl auf dieser Seite als auch anderen gegangen, aber ohne Erfolg. Dies ist eigentlich für mich gearbeitet:

Methode 1: Statt JSONObject als Parameter an die Ressource Methode, übergeben Sie eher eine String übergeben. Nehmen Sie die String und erstellen Sie eine JSONObject damit und dann können Sie es in Ihrem Code verwenden. Wie so,

@Path("/people") 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response doGetperson(String jsonRequest) { 
     try { 
      JSONObject requestedJSON = new JSONObject(jsonRequest); 

      //So now you can use requestedJSON object created to do your stuff 

      return Response.ok("{\"name\":" + requestedJSON.getString("user") + "}").build(); 
     } catch (Exception ex) { 
      return Response.ok("{ \"name\":\"\"}").build(); 
     } 
    } 

Methode 2:

Addiert man diese Abhängigkeit als von September 2017:

<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-moxy --> 
<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <version>2.26</version> 
</dependency> 

Reference from here

Verwandte Themen