web-dev-qa-db-ja.com

MessageBodyProviderNotFoundException:メディアタイプ= text / html; charset = UTF-8のMessageBodyReaderが見つかりません

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'
6
ashishjmeshram

最初に、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

クレジット

このソリューションは、次のリソースにある情報に基づいています。

スタックオーバーフロー

その他

1
Denis Abakumov

media typetext/htmlentityが一致しないため、問題が発生しています。 media type text/htmlメディアタイプでRESTfulサービスを使用できますが、media type Application/jsonを使用する必要があります。また、リクエストされたURLとリクエストとレスポンスのメディアタイプを確認します。

また使用

@Produces("application/json")
@Consumes(MediaType.APPLICATION_JSON)

適切なステータスコードとMediatypeで応答します

1
Anshul Sharma