Fehler 415 Nicht unterstützter Medientyp: POST erreicht REST nicht bei JSON, aber bei XML

Ich bin eigentlich neu in REST WS, aber ich bekomme diesen 415 Unsupported Media Type wirklich nicht.

Ich teste meine REST mit Poster auf Firefox und das GET funktioniert gut für mich, auch der POST (wenn es eine application/xml ), aber wenn ich application/json versuche, erreicht es den WS überhaupt nicht, der Server lehnt es ab .

Das ist meine URL: http: // localhost: 8081 / RestDemo / services / customers / add

Das ist JSON ich sende: {"name": "test1", "address" :"test2"}

Das ist XML ich sende:

  test1 
test2

und das ist meine Ressourcenklasse:

 @Produces("application/xml") @Path("customers") @Singleton @XmlRootElement(name = "customers") public class CustomerResource { private TreeMap customerMap = new TreeMap(); public CustomerResource() { // hardcode a single customer into the database for demonstration // purposes Customer customer = new Customer(); customer.setName("Harold Abernathy"); customer.setAddress("Sheffield, UK"); addCustomer(customer); } @GET @XmlElement(name = "customer") public List getCustomers() { List customers = new ArrayList(); customers.addAll(customerMap.values()); return customers; } @GET @Path("/{id}") @Produces("application/json") public String getCustomer(@PathParam("id") int cId) { Customer customer = customerMap.get(cId); return "{\"name\": \" " + customer.getName() + " \", \"address\": \"" + customer.getAddress() + "\"}"; } @POST @Path("/add") @Produces(MediaType.APPLICATION_JSON) @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public String addCustomer(Customer customer) { //insert int id = customerMap.size(); customer.setId(id); customerMap.put(id, customer); //get inserted Customer result = customerMap.get(id); return "{\"id\": \" " + result.getId() + " \", \"name\": \" " + result.getName() + " \", \"address\": \"" + result.getAddress() + "\"}"; } } 

EDIT 1:

Dies ist meine Kundenklasse:

 @XmlRootElement public class Customer implements Serializable { private int id; private String name; private String address; public Customer() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } 

Das Problem liegt in der Deserialisierung des Bean-Kunden. Ihre Programme wissen, wie man es in XML mit JAXB macht, während Daniel schreibt, aber höchstwahrscheinlich nicht weiß, wie man es in JSON macht.

Hier haben Sie ein Beispiel mit Resteasy / Jackson http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-restasy/

Das gleiche mit Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

Fügen Sie Content-Type: application/json und Accept: application/json im Kopfbereich des REST-Clients

Nur für den Fall, dass dies für andere hilfreich ist, hier ist meine Anekdote:

Ich habe diesen Thread als Ergebnis eines Problems gefunden, als ich Postman benutzte, um Testdaten an meinen RESTEasy-Server zu senden. Nach einer signifikanten Codeänderung erhielt ich nur 415 nicht unterstützte Medientyperrors.

Lange Rede, kurzer Sinn, ich riss alles raus, und schließlich versuchte ich, das Beispiel für den einfachen Upload von Dateien zu starten, von dem ich wusste, dass es funktionierte. es tat es nicht. Da merkte ich, dass das Problem mit meiner Postman-Anfrage zusammenhing. Normalerweise sende ich keine speziellen Header, aber in einem vorherigen Test hatte ich einen “Content-Type”: “application / json” Header hinzugefügt. Natürlich habe ich versucht, “multipart / form-data” hochzuladen. Das Entfernen hat mein Problem getriggers.

Moral: Überprüfen Sie Ihre Header, bevor Sie Ihre Welt in die Luft sprengen. 😉

Ich hatte dieses Problem und stellte fest, dass das Problem darin lag, dass ich die JacksonFeature-class nicht registriert hatte:

 // Create JAX-RS application. final Application application = new ResourceConfig() ... .register(JacksonFeature.class); 

Ohne dies zu tun, weiß Ihre Anwendung nicht, wie Sie den JSON in ein Java-Objekt konvertieren.

https://jersey.java.net/documentation/latest/media.html#json.jackson

Ich hatte das gleiche Problem:

curl -v -H “Inhaltstyp: application / json” -X PUT -d ‘{“name”: “json”, “familienname”: “gson”, “verheiratet”: true, “alter”: 32, ” Gehalt “: 123,” hasCar “: wahr,” childs “: [” serkan “,” volkan “,” aybars “]} ‘XXXXXX / ponyo / UserModel / json

 * About to connect() to localhost port 8081 (#0) * Trying ::1... * Connection refused * Trying 127.0.0.1... * connected * Connected to localhost (127.0.0.1) port 8081 (#0) > PUT /ponyo/UserModel/json HTTP/1.1 > User-Agent: curl/7.28.1 > Host: localhost:8081 > Accept: */* > Content-Type: application/json > Content-Length: 121 > * upload completely sent off: 121 out of 121 bytes < HTTP/1.1 415 Unsupported Media Type < Content-Type: text/html; charset=iso-8859-1 < Date: Wed, 09 Apr 2014 13:55:43 GMT < Content-Length: 0 < * Connection #0 to host localhost left intact * Closing connection #0 

Ich habe es getriggers, indem ich die Abhängigkeit zu pom.xml wie folgt hinzugefügt habe. Versuch es bitte.

   com.owlike genson 0.98  

Ich bekomme das gleiche Problem. In der Tat hat die Anfrage die Jersey-Annotationsmethode nicht erreicht. Ich habe das Problem mit der Annotation getriggers: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) Die Annotation @Consumes (” / “) funktioniert nicht!

  @Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH) @POST //@Consumes("*/*") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public void get__EstNouvelleGH( @Context HttpServletResponse response) { ... } 

Geben Sie keine Strings in Ihren Methoden zurück, aber der Kunde wendet sich selbst ab und lässt JAXB sich um die De- / Serialisierung kümmern.

Ich hatte das gleiche Problem, wie es Fehler-415-nicht unterstützt-Media-Typ geben, während Post-Anruf mit json, während ich bereits die hatte

 @Consumes(MediaType.APPLICATION_JSON) 

und Kopfzeilen wie in meinem erholsamen Web-Service mit Jersey 2.0+ anfordern

 Accept:application/json Content-Type:application/json 

Ich habe dieses Problem getriggers, indem ich folgende Abhängigkeiten zu meinem Projekt hinzugefügt habe

  org.glassfish.jersey.media jersey-media-json-jackson 2.25  

Dies wird folgende Bibliotheken zu Ihrer Bibliothek hinzufügen:

  1. jersey-media-json-jackson-2.25.jar
  2. Trikot-Entity-Filtering-2.25.jar
  3. jackson-module-jaxb-Anmerkungen-2.8.4.jar
  4. jackson-jaxrs-json-provider-2.8.4.jar
  5. jackson-jaxrs-base-2.8.4.jar

Ich hoffe, dass es auch für andere funktioniert.