web-dev-qa-db-fra.com

MessageBodyReader introuvable pour le type de support = application / octet-stream

J'essaie de recevoir des données json de http://api.openweathermap.org/data/2.5/forecast/daily?lat=35&lon=139&cnt=10&mode=json avec l'extrait de code suivant:

private WebTarget getWebTarget() {
    Client client = JerseyClientBuilder.newClient();
    return client.target("http://api.openweathermap.org/")
            .path("data")
            .path("2.5");
}

// new one method
    Response response = getWebTarget()
                        .path("daily")
                        .queryParam("q", String.format("%s,%s", town, countryCode))
                        .queryParam("cnt", 10)
                        .queryParam("mode", "json")
                        .request().accept(MediaType.APPLICATION_JSON_TYPE).get();
    WeatherForecast forecast = response.readEntity(WeatherForecast.class);

Mais la dernière ligne jette:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader introuvable pour le type de média = application/octet-stream, type = class com.app.weather.providers.org.openweathermap.pojo.WeatherForecast, genericType = class com.app .weather.providers.org.openweathermap.pojo.WeatherForecast.

Dépendances de Jersey dans pom.xml:

<dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.4</version>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json</artifactId>
            <version>2.0-m05-1</version>
        </dependency>

Ce code s'exécute en dehors du serveur d'applications. Merci.

14
user2966560

La prise en charge de Jersey JSON se présente sous la forme d'un ensemble de modules d'extension où chacun de ces modules contient une implémentation d'une Feature qui doit être enregistrée dans votre instance Configurable (client/serveur). Il existe plusieurs cadres qui prennent en charge le traitement JSON et/ou la liaison JSON à Java. Les modules répertoriés ci-dessous prennent en charge les représentations JSON en intégrant les différents cadres JSON dans Jersey. À l'heure actuelle, Jersey s'intègre aux modules suivants pour fournir une prise en charge JSON:

  • MOXy - La prise en charge de la liaison JSON via MOXy est un moyen par défaut et préféré de prendre en charge la liaison JSON dans vos applications Jersey depuis Jersey 2.0. Lorsque le module JSON MOXy est sur le chemin de classe, Jersey découvrira automatiquement le module et activera de manière transparente la prise en charge de la liaison JSON via MOXy dans vos applications. (Voir Section 4.3, "Fonctionnalités auto-détectables".)
  • API Java pour le traitement JSON (JSON-P)
  • Jackson
  • Abandonner

pour plus d'informations, lisez chapitre 9 de la documentation du maillot.

Moxy est la méthode proposée pour le support média json. Le module multimédia MOXy est l'un des modules où vous n'avez pas besoin d'enregistrer explicitement ses fonctionnalités (MoxyJsonFeature) dans votre client/serveur configurable car cette fonctionnalité est automatiquement découverte et enregistrée lorsque vous ajoutez le module jersey-media-moxy à votre chemin de classe .

Pour utiliser MOXy comme fournisseur JSON, vous devez ajouter le module jersey-media-moxy à votre fichier pom.xml:

<dependency>
   <groupId>org.glassfish.jersey.media</groupId>
   <artifactId>jersey-media-moxy</artifactId>
   <version>2.15</version>
</dependency>

Si vous n'utilisez pas Maven, assurez-vous d'avoir toutes les dépendances nécessaires. voir dépendances jersey-media-moxy .
Vous devez ajouter ces fichiers jar à votre projet afin de prendre en charge les types de médias json via jersey-media-moxy:

  • jersey-media-moxy-2.15.jar
  • org.Eclipse.persistence.core-2.5.0-rc2.jar
  • org.Eclipse.persistence.antlr-2.5.0.jar
  • org.Eclipse.persistence.moxy-2.5.0.jar
  • jersey-entity-filtering-2.3.1.jar

Usage:

une classe ordinaire:

public class MyJAXBBean{

   private String name = "jack";
   private int id = 12;

   public MyJAXBBean() {

   }

   public String getName() {
       return this.name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getId() {
       return this.id;
   }

   public void setId(int id) {
       this.id = id;
   }
}

Et une classe principale pour exécuter un exemple de client de maillot:

 public static void main(String[] args) {
    //ClientConfig cc = new ClientConfig().register(new JacksonFeature());
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://localhost:8084/myhost/test");

    Form form = new Form();
    form.param("x", "foo");
    form.param("y", "bar");

    MyJAXBBean bean;
    bean = target.request(MediaType.APPLICATION_JSON_TYPE)
            .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE),
                    MyJAXBBean.class);
    System.out.println(bean);
}

la réponse json du serveur (http://localhost:8084/myhost/test) doit être au format suivant:

 {"name":"haleh", "id":3}
3
Dariush Jafari

Résolu en écrivant MessageBodyReader personnalisé. https://jersey.Java.net/documentation/latest/message-body-workers.html#d0e4072

2
user2966560

J'ai eu un problème similaire, essayant de démarshal JSON servi avec le type de support "application/javascript". Je voudrais juste contribuer à la réponse originale, en donnant un exemple de la façon dont j'ai mis en œuvre la solution suggérée. Vous pouvez changer le type de support selon vos besoins.

@Provider
@Consumes("application/javascript")
public class MyMoxyJSONProvider extends MOXyJsonProvider {
    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return mediaType.equals(MediaType.valueOf("application/javascript"));
    }
}
2
Gio