Tipo de mídia não suportado do Jersey 415

Eu tenho tentado desde horas para corrigir erro de HTTP 415 Unsupported Media Type mas ainda está mostrando a página de mídia não suportada. Estou adicionando headers application/json no Postman.

Aqui está o meu código Java

 package lostLove; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.json.JSONObject; @Path("/Story") public class Story { @POST @Consumes({"application/json"}) @Produces(MediaType.APPLICATION_JSON) // @Consumes(MediaType.APPLICATION_JSON) // @Path("/Story") public JSONObject sayJsonTextHello(JSONObject inputJsonObj) throws Exception { String input = (String) inputJsonObj.get("input"); String output = "The input you sent is :" + input; JSONObject outputJsonObj = new JSONObject(); outputJsonObj.put("output", output); return outputJsonObj; } @GET @Produces(MediaType.TEXT_PLAIN) public String sayPlainTextHello() { return "hello"; } } 

aqui está o meu arquivo web.xml

   LostLove  index.html index.htm index.jsp default.html default.htm default.jsp   Jersey REST Service org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages lostLove  1   Jersey REST Service /rest/*   

Como nossos objects são serializados e desserializados para e do stream de resposta e stream de solicitação, é através de MessageBodyWriter e MessageBodyReader s .

O que acontecerá é que uma busca será feita a partir do cadastro de provedores, por um que possa manipular JSONObject e tipo de mídia application/json . Se não for possível encontrá-lo, Jersey não poderá atender à solicitação e enviará um 415 Unsupported Media Type. Você deve normalmente obter uma exceção registrada também no lado do servidor. Não tenho certeza se você teve a chance de ver o log ainda.

Jersey não possui nenhum leitor / gravador padrão para os objects org.json . Você teria que pesquisar na web por uma implementação ou escrever um, depois registrá-lo. Você pode ler mais sobre como implementá-lo aqui .

Alternativamente, você poderia aceitar uma String e retornar uma String. Apenas construa o JSONObject com o parâmetro string e chame JSONObject.toString() ao retornar.

 @POST @Consumes("application/json") @Produces("application/json") public String post(String jsonRequest) { JSONObject jsonObject = new JSONObject(jsonRequest); return jsonObject.toString(); } 

Minha sugestão, em vez disso, seria usar uma estrutura de vinculação de dados como Jackson, que pode manipular serializar e desserializar para e fora de objects de modelo (POJOs simples). Por exemplo, você pode ter uma aula como

 public class Model { private String input; public String getInput() { return input; } public void setInput(String input) { this.input = input; } } 

Você poderia ter o Model como um parâmetro de método

 public ReturnType sayJsonTextHello(Model model) 

O mesmo para o ReturnType . Basta criar um POJO para o tipo que você deseja retornar. As propriedades JSON são baseadas nos nomes de propriedades JavaBean (getters / setters seguindo a convenção de nomenclatura mostrada acima).

Para obter esse suporte, você pode adicionar essa dependência do Maven:

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

Ou se você não estiver usando o Maven, você pode ver este post , para os jars você pode baixar de forma independente.

Alguns resources:

  • Suporte para Jersey JSON
  • Documentação Jackson

É por causa do seguinte problema:

O JAX-RS não suporta a conversão de mapeamento padrão do Jackson. Então, se você tem o pedido de ajax como abaixo (Post):

  jQuery.ajax({ url: "http://localhost:8081/EmailAutomated/rest/service/save", type: "POST", dataType: "JSON", contentType: "application/JSON", data: JSON.stringify(data), cache: false, context: this, success: function(resp){ // we have the response alert("Server said123:\n '" + resp.name + "'"); }, error: function(e){ alert('Error121212: ' + e); } }); 

e no lado do controlador JAX-RS você precisa fazer como abaixo:

 @Path("/save") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String saveDetailsUser(String userStr) { Gson gson = new Gson(); UserDetailDTO userDetailDTO = gson.fromJson(userStr, UserDetailDTO.class); String vemail = userDetailDTO.getEMAIL(); return "userDetailDTO"; } 

Aqui por favor, certifique-se no parâmetro. serviço está aceitando json como String não o POJO.

Certamente vai funcionar. Obrigado!