【问题标题】:MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=UTF-8MessageBodyProviderNotFoundException:找不到媒体类型的 MessageBodyReader=text/html;charset=UTF-8
【发布时间】:2018-01-11 22:12:12
【问题描述】:

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

【问题讨论】:

  • 您连接到正确的 URL 了吗?在错误消息中,它说您收到的响应具有媒体类型text/html,显然不能将其解析为用户实体。这很可能是由于没有收到成功的响应(200 OK)或连接到错误的 URL。
  • 做一些调试。检查状态码和正文。在客户端反序列化之前检查状态码总是一个好主意,所以你可以在错误状态下做其他事情
  • 得到了问题。实际上我必须在 openfire 中安装 REST API 插件。
  • @ashishjmeshram - 面临同样的问题,在用于休息调用的 java 代码中 - 请求、响应都将内容类型指定为 application/json 但出现异常为org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=UTF-8, type=interface java.util.Map, genericType=interface java.util.Map. 你能解释一下你是怎么做的吗解决您的问题?
  • @ChristophBöhme,谢谢!就我而言,这是由错误的端点地址引起的!我一直在解决这个错误,直到我检查了另一个工作正常的服务(并且地址无效,它导致了同样的错误)。

标签: java jersey openfire rest-client


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    让我们首先看看 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: 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()。

    最后,我们需要在 javax.ws.rs.client.Client 的实例中注册我们的自定义阅读器,该实例将查询我们的 Web 服务:

    Client client = ClientBuilder.newBuilder().build().register(MyCustomResponseReader.class);
    

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

    GitHub

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

    学分

    我根据以下资源中的信息提供此解决方案:

    堆栈溢出

    其他

    【讨论】:

    • 您正在从请求中读取文本以转换为后端的对象。名称 "MyCustomResponseReader" 应为 "MyCustomRequestReader"
    • @JerylCook:这是客户的示例。它向服务器发送请求并将其响应转换为实体。因此响应阅读器。为了让 MyCustomRequestReader 有意义,这应该是一个服务器应用程序。
    【解决方案3】:

    因为media type text/htmlentity 不匹配而出现问题。您可以使用带有media type text/html 媒体类型的restful 服务,但您需要使用media type Application/json。并检查请求的 url 和媒体类型的请求和响应。

    也用

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

    并使用正确的状态码和Mediatype做出响应

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-21
      • 2016-12-19
      • 2012-05-12
      • 1970-01-01
      • 2011-07-12
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多