2015-05-24 20 views
7

Używam aplikacji internetowej JAX-RS z firmą Jersey i Tomcat. Otrzymuj żądania są dobre, ale gdy próbuję wysłać JSON, otrzymuję status HTTP 415 - Unsupported Media Type.Usługa POST do usługi REST usługi Jersey otrzymująca błąd 415 Nieobsługiwany nośnik Typ

Oto mój prosty 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; 
    } 
} 

Oto prośba Staram w Postman (z 'application/json' header):

enter image description here Oto układ projekt z bibliotekami : enter image description here

Używam:

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

Dzięki!

Odpowiedz

29

Dystrybucja Jersey nie jest dostarczana z obsługą JSON/POJO. Musisz dodać zależności/słoiki.

Dodaj wszystkie te

Z Maven, poniżej będzie ciągnąć wszystko powyższe

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.17</version> 
</dependency> 

ewentualnych przyszłych czytelników nie korzystających Jersey 2,17 (i korzystających słoików bezpośrednio zamiast Maven), można przejść here znaleźć wersję Jersey, z której korzystasz, i sprawdzić, jakich wersji zależności przejściowych potrzebujesz. Obecna wersja zależności od Jersey używa Jackson 2.3.2. To najważniejsza rzecz, na którą musisz zwrócić uwagę.

+2

mógłby tam być problemy, ponieważ jest on za pomocą tomcat zamiast glassfish? – sschrass

+0

Dodałem słoiki do lib. Teraz otrzymuję ten błąd 'java.lang.NoClassDefFoundError: org/glassfish/jersey/message/filtering/EntityFilteringFeature' podczas uruchamiania Tomcat. Wsparcie? –

+0

Po prostu dodaj zależność w swoim pliku pom tak, jak zasugerował wyżej peeskillet. – hemant

0

Wydaje mi się, że zgłoszenie wysłane pocztą działa poprawnie, ale przeglądarka/Postman nie może przeanalizować odpowiedzi zwróconej przez usługę. Zwraca zwykły tekst, a Postman czeka json. Dodaj Utwórz adnotację do swojej usługi internetowej i ustaw ją również na json. Proponuję również, abyś sprawdził z Fiddler2, aby zobaczyć dokładne informacje przechodzące przez przewód.

1

Sprawdź połączenie REST contentType. Powinien to być contentType: "application/json", jeśli przekazujesz dane json do klasy POJO.

0

Przeminęło wiele odpowiedzi na tej stronie i innych, ale bez skutku. To rzeczywiście pracował dla mnie:

METODA 1: Zamiast przechodzenia JSONObject jako parametr metody zasobów, zdać String raczej. Weź String i utwórz z nim JSONObject, a następnie możesz go użyć w swoim kodzie. Jak tak,

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

METODA 2:

Dodanie tego uzależnienia, jak z września 2017:

<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-moxy --> 
<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <version>2.26</version> 
</dependency> 

Reference from here

Powiązane problemy