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.
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:
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:
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}
Résolu en écrivant MessageBodyReader personnalisé. https://jersey.Java.net/documentation/latest/message-body-workers.html#d0e4072
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"));
}
}