Erro 415 Tipo de mídia não suportado: POST não atingindo REST se JSON, mas sim se for XML

Na verdade, sou novo no REST WS, mas realmente não entendo esse 415 Unsupported Media Type .

Estou testando meu REST com Poster no Firefox e o GET funciona bem para mim, também o POST (quando é um application/xml ) mas quando tento application/json ele não chega ao WS, o servidor o rejeita .

Esta é a minha URL: http: // localhost: 8081 / RestDemo / services / customers / add

Este é o JSON que estou enviando: {"name": "test1", "address" :"test2"}

Este é o XML que estou enviando:

  test1 
test2

e esta é minha class Resource:

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

Esta é minha class de 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; } } 

O problema está na desserialização do bean Customer. Seus programas sabem como fazê-lo em XML, com o JAXB como Daniel está escrevendo, mas provavelmente não sabem como fazer isso em JSON.

Aqui você tem um exemplo com Resteasy / Jackson http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

O mesmo com Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

Adicionar tipo de Content-Type: application/json e Accept: application/json na seção de header do REST Client

Apenas no caso de isso ser útil para os outros, aqui está minha anedota:

Eu encontrei este segmento como resultado de um problema que encontrei enquanto eu estava usando Postman para enviar dados de teste para o meu servidor RESTEasy, onde depois de uma mudança de código significativa, eu estava recebendo nada, mas 415 erros de tipo de mídia não suportados.

Resumindo a história, eu rasguei tudo, eventualmente eu tentei executar o exemplo de upload de arquivo trivial que eu sabia que funcionava; isso não aconteceu. Foi quando percebi que o problema estava no meu pedido de carteiro. Eu normalmente não envio headers especiais, mas em um teste anterior eu adicionei um header “Content-Type”: “application / json”. DE CURSO, eu estava tentando fazer upload de “multipart / form-data”. A remoção resolveu meu problema.

Moral: Verifique seus headers antes de explodir seu mundo. 😉

Eu tive esse problema e descobri que o problema era que eu não havia registrado a class JacksonFeature:

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

Sem fazer isso, seu aplicativo não sabe como converter o JSON em um object java.

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

Eu tive o mesmo problema:

curl -v -H “Tipo de conteúdo: aplicativo / json” -X PUT -d ‘{“nome”: “json”, “sobrenome”: “gson”, “casado”: verdadeiro, “idade”: 32, ” salário “: 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 

Eu resolvi adicionando a dependência ao pom.xml da seguinte maneira. Por favor tente.

   com.owlike genson 0.98  

Eu recebo o mesmo problema. Na verdade, a solicitação não alcançou o método anotado em jersey. Eu resolvi o problema adicionando a anotação: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) A anotação @Consumes (” / “) não funciona!

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

Não retorne Strings em seus methods, mas o Cliente se auto-objecte e deixe que o JAXB cuide do de / serialization.

Eu tive o mesmo problema, como estava dando erro-415-unsupported-media-tipo ao bater pós-chamada usando json enquanto eu já tinha o

 @Consumes(MediaType.APPLICATION_JSON) 

e solicitar headers como no meu serviço web tranquilo usando Jersey 2.0+

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

Eu resolvi esse problema adicionando as seguintes dependencies ao meu projeto

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

Isso adicionará os seguintes jars à sua biblioteca:

  1. jersey-media-json-jackson-2.25.jar
  2. jersey-entity-filtering-2.25.jar
  3. jackson-module-jaxb-annotations-2.8.4.jar
  4. jackson-jaxrs-json-provider-2.8.4.jar
  5. jackson-jaxrs-base-2.8.4.jar

Espero que funcione para os outros também como para mim.