使用ClientResponse发布时,Jersey客户端MessageBodyProviderNotFoundException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ClientResponse发布时,Jersey客户端MessageBodyProviderNotFoundException相关的知识,希望对你有一定的参考价值。

我正在尝试使用Jersey客户端来调用REST服务(它不使用Jersey / JAX-RS)。以下代码可以正常POST我的表单数据并收到响应:

    Form form = new Form();
    form.param("email", email);
    form.param("password", password);

    String clientResponse =
            target.request(MediaType.TEXT_PLAIN)
                    .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE),
                          String.class);

代码运行正常,clientResponse变量包含来自服务器的纯文本响应。

现在,我需要检查服务器返回的状态代码。据我所知,我需要将响应检索为ClientResponse对象而不是String。所以,我将我的代码更改为:

    Form form = new Form();
    form.param("email", email);
    form.param("password", password);

    ClientResponse clientResponse =
            target.request(MediaType.TEXT_PLAIN)
                    .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE),
                          ClientResponse.class);

当我运行这个新代码时,我得到以下异常:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到媒体类型= text / plain的MessageBodyReader,类型= class org.glassfish.jersey.client.ClientResponse,genericType = class org.glassfish.jersey.client.ClientResponse。

为什么我得到这个例外?

答案

你不使用ClientResponse。你应该使用Response。当您希望响应实体自动反序列化时,您只需要使用.post()的第二个参数。如果不使用第二个参数,则返回类型为Response。然后,您可以使用Response#readEntity()读取/反序列化实体

Response response = target
    .request(MediaType.TEXT_PLAIN)
    .post(Entity.form(form));

String data = response.readEntity(String.class);

以上是关于使用ClientResponse发布时,Jersey客户端MessageBodyProviderNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

泛型类型的 Jersey ClientResponse.getEntity

如何从 Mono<ClientResponse> 获取正文?

aiohttp 异步http请求-11.ClientResponse 获取响应headers 和cookies

如何返回改造时使用的方法OnResponse的列表?

为啥我在执行 POST 请求时收到 405 Method Not Allowed

如何让我的Jersey 2端点在启动时急切地初始化?