http://api.openweathermap.org/data/2.5/forecast/daily?lat=35&lon=139&cnt=10&mode=json からjsonデータを受信しようとしていますが、次のコードスニペットがあります。
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);
しかし、最後の行がスローされます:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:Media type = application/octet-stream、type = class com.app.weather.providers.org.openweathermap.pojo.WeatherForecast、genericType = class com.appのMessageBodyReaderが見つかりません.weather.providers.org.openweathermap.pojo.WeatherForecast。
Pom.xmlのJersey依存関係:
<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>
このコードは、アプリケーションサーバーの外部で実行されます。ありがとう。
Jersey JSONサポートは、これらの各モジュールにFeature
インスタンス(クライアント/サーバー)に登録する必要があるConfigurable
の実装が含まれる拡張モジュールのセットとして提供されます。 JSON処理やJSON-to-Javaバインディングのサポートを提供する複数のフレームワークがあります。下記のモジュールは、個々のJSONフレームワークをJerseyに統合することにより、JSON表現のサポートを提供します。現在、Jerseyは次のモジュールと統合してJSONサポートを提供しています。
詳細については、ジャージのドキュメントの chapter 9 を参照してください。
Moxyは、jsonメディアサポートの提案された方法です。 MOXyメディアモジュールは、jersey-media-moxyモジュールをクラスパスに追加すると自動的に検出および登録されるため、クライアント/サーバーにその機能(MoxyJsonFeature)を明示的に登録する必要がないモジュールの1つです。 。
JSONプロバイダーとしてMOXyを使用するには、jersey-media-moxyモジュールをpom.xmlファイルに追加する必要があります。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.15</version>
</dependency>
Mavenを使用していない場合は、必要なすべての依存関係があることを確認してください。 jersey-media-moxyの依存関係 を参照してください。
jersey-media-moxyを介してjsonメディアタイプをサポートするには、これらのjarファイルをプロジェクトに追加する必要があります。
普通のクラス:
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;
}
}
そして、ジャージクライアントのサンプルを実行するためのメインクラス:
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);
}
サーバーのJSON応答(http://localhost:8084/myhost/test
)は次の形式である必要があります。
{"name":"haleh", "id":3}
カスタムMessageBodyReaderを作成することで解決しました。 https://jersey.Java.net/documentation/latest/message-body-workers.html#d0e4072
同様の問題が発生しました。メディアタイプ「application/javascript」で提供されるJSONを非整列化しようとしています。元の答えに貢献したいのですが、提案されたソリューションをどのように実装したかの例を示します。必要に応じてメディアタイプを変更できます。
@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"));
}
}