MessageBodyProviderNotFoundException:找不到媒体类型= text / html的MessageBodyReader; charset = UTF-8

时间:2017-08-04 05:31:51

标签: java jersey openfire rest-client

我正在尝试使用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)

我用Google搜索,看起来依赖项存在问题。但没有任何效果。

以下是我的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'

3 个答案:

答案 0 :(得分:1)

问题正在发生,因为media type text/htmlentity不匹配。您可以使用media type text/html媒体类型的宁静服务,但需要使用media type Application/json。并检查请求和响应的请求网址和媒体类型。

也可以使用

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

并使用正确的状态代码和Mediatype

进行回复

答案 1 :(得分:0)

首先让我们看看Jersey JAX-RS如何解析具有正确Content-Type的JSON响应:application / 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:文本/纯文本响应。 为此,我们同时从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);

现在,文本/纯文本响应将像任何应用程序/ json一样被解析。

GitHub

完整的解决方案可以在GitHub上找到:PlainTextResponseReader

积分

我基于以下资源中的信息来解决此问题:

堆栈溢出

其他

答案 2 :(得分:0)

有同样的问题。 Bean只是缺少默认的构造函数。