Errore 415 Tipo di supporto non supportato: POST non raggiunge REST se JSON, ma lo fa se XML

In realtà sono nuovo di REST WS, ma in realtà non capisco questo 415 Unsupported Media Type .

Sto testando il mio REST con Poster su Firefox e il GET funziona bene per me, anche il POST (quando si tratta di application/xml ) ma quando provo l’ application/json non arriva affatto al WS, il server lo rifiuta .

Questo è il mio URL: http: // localhost: 8081 / RestDemo / services / customers / add

Questo è JSON che sto inviando: {"name": "test1", "address" :"test2"}

Questo è XML che sto inviando:

  test1 
test2

e questa è la mia class di risorse:

 @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() + "\"}"; } } 

MODIFICA 1:

Questa è la mia class di cliente:

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

Il problema è nella deserializzazione del bean bean. I tuoi programmi sanno come farlo in XML, con JAXB come Daniel sta scrivendo, ma molto probabilmente non sa come farlo in JSON.

Ecco un esempio di Resteasy / Jackson http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

Lo stesso con Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

Aggiungi Content-Type: application/json e Accept: application/json nella sezione dell’intestazione del client REST

Nel caso questo sia utile per gli altri, ecco il mio aneddoto:

Ho trovato questo thread come risultato di un problema che ho riscontrato mentre stavo utilizzando Postman per inviare i dati di test al mio server RESTEasy, dove, dopo un significativo cambio di codice, non ricevevo altro che 415 errori di tipo di supporto non supportato.

Per farla breve, ho strappato tutto, alla fine ho cercato di eseguire l’esempio di caricamento di file banali che sapevo funzionasse; non è stato così. Fu allora che mi resi conto che il problema era con la mia richiesta Postman. Normalmente non invio intestazioni speciali, ma in un test precedente avevo aggiunto un “Content-Type”: intestazione “application / json”. DEL CORSO, stavo cercando di caricare “multipart / form-data”. La rimozione ha risolto il mio problema.

Morale: controlla le intestazioni prima di far esplodere il tuo mondo. 😉

Ho avuto questo problema e ho scoperto che il problema era che non avevo registrato la class JacksonFeature:

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

Senza fare ciò, l’applicazione non sa come convertire il JSON in un object java.

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

Ho avuto lo stesso problema:

curl -v -H “Content-Type: application / json” -X PUT -d ‘{“name”: “json”, “cognome”: “gson”, “married”: true, “age”: 32, ” salario “: 123,” hasCar “: true,” 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 

L'ho risolto aggiungendo la dipendenza a pom.xml come segue. Per favore provalo

   com.owlike genson 0.98  

Ho lo stesso problema. In realtà, la richiesta non ha raggiunto il metodo della maglia annoted. Ho risolto il problema aggiungendo l’annotazione: @Consumi (MediaType.APPLICATION_FORM_URLENCODED) L’annotazione @Consumi (” / “) non funziona!

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

Non restituire le stringhe nei tuoi metodi, ma il cliente si auto-ordina e lascia che JAXB si occupi della de / serializzazione.

Ho avuto lo stesso problema, dato che stava dando errore-415-non supportato-tipo-media mentre stavo chiamando dopo aver usato json mentre avevo già il

 @Consumes(MediaType.APPLICATION_JSON) 

e richiedere le intestazioni come nel mio servizio web restful usando Jersey 2.0+

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

Ho risolto questo problema aggiungendo le seguenti dipendenze al mio progetto

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

questo aggiungerà i seguenti barattoli alla tua libreria:

  1. jersey-media-JSON-jackson-2.25.jar
  2. jersey- quadro-filtraggio 2.25.jar
  3. jackson-module-JAXB-annotazioni-2.8.4.jar
  4. jackson-jaxrs-JSON-provider-2.8.4.jar
  5. Jackson-jaxrs-base-2.8.4.jar

Spero che funzioni anche per gli altri come ha fatto per me.