Openfire REST-API-Clientを使用しようとしています。次のコードを使用して、ユーザーをOpenfireに追加するメソッドを呼び出しています。
AuthenticationToken authenticationToken = new AuthenticationToken("username","password");
RestApiClient restApiClient = new RestApiClient("url",port, authenticationToken);
UserEntity openFireUser = restApiClient.getUser(user.getUsername());
APIを呼び出すと、次の例外が発生します。
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=UTF-8, type=class org.igniterealtime.restclient.entity.UserEntity, genericType=class org.igniterealtime.restclient.entity.UserEntity.
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.Java:231)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.Java:155)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.Java:1085)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.Java:874)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.Java:808)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.Java:326)
at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.Java:115)
私はググって、依存関係にいくつかの問題があるようです。しかし、何もうまくいきませんでした。
以下は私のbuild.gradleです
compile(group: 'org.igniterealtime', name :'rest-api-client', version: igniterealtime_rest_api_version){
exclude group: 'org.slf4j', module: 'slf4j-simple'
exclude group: 'org.slf4j', module: 'slf4j-api'
}
また、次の依存関係をbuild.gradleに追加しようとしましたが、機能しませんでした。
compile group: 'org.glassfish.jersey.core', name: 'jersey-client', version: '2.23'
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.2'
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: '2.24'
compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.4.1'
最初に、Jersey JAX-RSが正しいContent-Type:application/jsonでJSON応答を解析する方法を見てみましょう。そのような応答を受け取ると、次のように注釈が付けられたjavax.ws.rs.ext.MessageBodyReaderインターフェースの使用可能な実装を探します。
@Consumes(MediaType.APPLICATION_JSON)
これは任意の実装にすることができますが、この例では、プロジェクトへの依存関係としてMOXyJsonProviderを追加しました。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>${jersey.version}</version>
</dependency>
次に、Content-Type:text/plain応答も処理できるようにします。このため、MOXyJsonProviderからカスタム応答リーダーを継承すると同時に、MediaType.TEXT_PLAINで注釈を付けます。
@Provider
@Consumes(MediaType.TEXT_PLAIN)
public class MyCustomResponseReader extends MOXyJsonProvider {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return genericType.equals(MyCustomClass.class);
}
@Override
public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException {
return super.readFrom(type, genericType, annotations, mediaType, httpHeaders, entityStream);
}
}
オーバーライドされたreadFrom()メソッドでは、親クラスMOXyJsonProviderのsuper.readFrom()を呼び出すだけであることに注意してください。
最後に、Webサービスを照会するjavax.ws.rs.client.Clientのインスタンスにカスタムリーダーを登録する必要があります。
Client client = ClientBuilder.newBuilder().build().register(MyCustomResponseReader.class);
これで、text/plain応答は、あらゆるapplication/json応答と同様に解析されます。
GitHub
完全なソリューションはGitHubにあります: PlainTextResponseReader
クレジット
このソリューションは、次のリソースにある情報に基づいています。
スタックオーバーフロー
その他
media type
text/html
とentity
が一致しないため、問題が発生しています。 media type text/html
メディアタイプでRESTfulサービスを使用できますが、media type Application/json
を使用する必要があります。また、リクエストされたURLとリクエストとレスポンスのメディアタイプを確認します。
また使用
@Produces("application/json")
@Consumes(MediaType.APPLICATION_JSON)
適切なステータスコードとMediatype
で応答します