web-dev-qa-db-fra.com

POST vers Jersey REST obtient l'erreur 415 Type de support non pris en charge)

J'utilise une application Web JAX-RS avec Jersey et Tomcat. Les demandes d'obtention sont correctes cependant quand j'essaye de publier JSON j'obtiens un statut HTTP 415 - Type de support non pris en charge.

Voici mon simple 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;
    }
}

Voici la requête que j'essaie dans Postman (avec en-tête 'application/json'):

enter image description here Voici la disposition du projet avec les bibliothèques: enter image description here

J'utilise:

  • Java 7 x64
  • Jersey 2.17
  • Tomcat 7.0.62 x64

Merci!

12
Rob Crocombe

La distribution Jersey n'est pas fournie avec le support JSON/POJO. Vous devez ajouter les dépendances/jars.

Ajoutez tous ces

Avec Maven, ci-dessous tirera tout ce qui précède dans

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

Pour tous les futurs lecteurs n'utilisant pas Jersey 2.17 (et utilisant directement des jars au lieu de Maven), vous pouvez aller ici pour trouver la version de Jersey que vous utilisez et voir de quelles versions de dépendance transitoire vous avez besoin. La version actuelle de cette dépendance Jersey utilise Jackson 2.3.2. C'est la principale chose à surveiller.

44
Paul Samsotha

Je suis passé par beaucoup de réponses sur cette page et sur d'autres, mais en vain. Cela a réellement fonctionné pour moi:

MÉTHODE 1: Au lieu de passer JSONObject comme paramètre à la méthode de ressource, passez plutôt un String. Prenez le String et créez un JSONObject avec lui et vous pourrez ensuite l'utiliser dans votre code. Ainsi,

    @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ÉTHODE 2:

Ajout de cette dépendance à partir du septembre 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>

Référence d'ici

2
Young Emil

Vérifiez votre REST appel contentType. Il doit s'agir de contentType: 'application/json', si vous passez des données json à la classe POJO.

1
Suresh Patil

J'utilisais des API Firebase qui utilisaient en interne gson (JSON) apis et jersey JSON databinding voulu jersey-media-json-jackson-2.29.jar. Le chemin de classe par défaut conservait les API gson de Firebase comme premières API JSON et, par conséquent, les choses ne fonctionnaient pas.

Changement du manifeste.mf pour la séquence de chemin de classe et les choses ont commencé à fonctionner pour moi. Bien que je ne puisse pas continuer avec maven dans ces scénarios et que je n'arrive pas à comprendre comment ajouter notre chemin de classe personnalisé dans Maven build war's Manifest.mf.

Ajout de l'entrée de chemin de classe ci-dessous dans Manifest.mf dans le projet Web dynamique. Copie de la source de mon projet dans les fichiers source et téléchargés de maven vers web-inf\lib. J'ai créé la guerre en utilisant l'exportation Eclipse en tant que fichier WAR et les choses ont fonctionné pour moi.

Chemin d'accès aux classes: jersey-media-json-jackson-2.29.jar jackson-databind-2.9.9.jar gson-2.6.2.jar json-20160212.jar google-http-client-gson-1.21.0.jar

La plupart des erreurs diverses sont dues à des conflits de chemin de classe lorsque vous utilisez plusieurs API dans votre projet. Obtient vraiment difficile à comprendre.

0
Deepali Maniyar