Serviço POST para Jersey REST recebendo erro 415 Tipo de mídia não suportado

Eu estou usando um aplicativo da web JAX-RS com Jersey e Tomcat. Receber solicitações são muito bem, no entanto, quando tento postar JSON eu recebo um status HTTP 415 – tipo de mídia não suportado.

Aqui está o meu simples 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; } } 

Aqui está o pedido que eu tento no Postman (com header ‘application / json’):

insira a descrição da imagem aqui Aqui está o layout do projeto com bibliotecas: insira a descrição da imagem aqui

Estou usando:

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

Obrigado!

A distribuição de Jersey não vem com suporte a JSON / POJO. Você precisa adicionar dependencies / jars.

Adicione todos estes

  • jersey-media-json-jackson-2.17
  • jackson-jaxrs-json-provider-2.3.2
  • jackson-core-2.3.2
  • jackson-databind-2.3.2
  • jackson-annotations-2.3.2
  • jackson-jaxrs-base-2.3.2
  • jackson-module-jaxb-annotations-2.3.2
  • jersey-entidade-filtragem-2,17

Com Maven, abaixo vai puxar todos os acima em

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

Para qualquer futuro leitor que não esteja usando o Jersey 2.17 (e usando jars diretamente ao invés do Maven), você pode ir até aqui para encontrar a versão de Jersey que está usando e ver de que versões de dependência transitiva você precisa. A versão atual desta dependência de Jersey usa Jackson 2.3.2. Essa é a principal coisa que você precisa olhar para fora.

Verifique seu conteúdo contentType da chamada REST. Deve ser contentType: ‘application / json’, se você está passando dados json para a class POJO.

Passou por muitas das respostas nesta página e outras, mas sem sucesso. Isso realmente funcionou para mim:

MÉTODO 1: Em vez de passar JSONObject como parâmetro para o método resource, passe uma String . Pegue o String e crie um JSONObject com ele e então você poderá usá-lo no seu código. Igual a,

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

MÉTODO 2:

Adicionando essa dependência a partir de setembro de 2017 :

   org.glassfish.jersey.media jersey-media-moxy 2.26  

Referência daqui

Eu acho que você postar o pedido está funcionando corretamente, mas o seu navegador / carteiro não pode analisar a resposta retornada do serviço. Está retornando o texto liso e o carteiro está esperando json. Adicione Produzir annotations ao seu serviço da Web e configure-o para json também. Eu também sugiro que você verifique com o Fiddler2 para ver as informações exatas passando pelo fio.