Jersey:如何将 MediaType 设置为 javax.ws.rs.core.Response,如果真正的“物理”响应标头没有任何相关信息

Posted

技术标签:

【中文标题】Jersey:如何将 MediaType 设置为 javax.ws.rs.core.Response,如果真正的“物理”响应标头没有任何相关信息【英文标题】:Jersey: how to set MediaType to javax.ws.rs.core.Response, if real "physical" response header does not have any information about it 【发布时间】:2013-11-21 14:45:29 【问题描述】:

当我向服务器发送请求时

...
Response response = builder.method(req.getMethod(), Entity.entity(req, req.getMediaType())); // req.getMediaType() return MediaType.APPLICATION_XML
if(response.getStatus() != 200)
   throw new CoreErrorException("core resulted error with status = " + response.getStatus());
T resp = response.readEntity(respType);
...

Jersey 在最后一行抛出异常:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/octet-stream

我做了一些调查。首先,我得到了回应:

Content-Length: 93
Date: Thu, 21 Nov 2013 12:53:46 GMT
Server: APP

<root>
   <returncode>XXX</returncode>
   <desc>some description</desc>
</root>

标头不包含任何有关 MediaType 的信息。

确实,当我尝试调用 response.getMediaType() 时,它返回 null

我认为,这就是问题所在。 Jersey 无法检测响应的 MediaType 并默认设置它(“application/octet-stream”)。但实际上我的响应主体是 XML。有什么方法可以告诉泽西岛吗?

【问题讨论】:

【参考方案1】:

尝试通过调用WebTarget#request(MediaType)Accept标头添加到您的请求中,

ClientBuilder.newClient()
    .target("mytarget")
    .request("application/xml")
    .method(req.getMethod(), Entity.entity(req, req.getMediaType()));

服务器是否没有在响应中添加Content-Type 标头。如果没有,您可以尝试使用 WriterInterceptor 或简单地调用来更改客户端站点上的标题

Response response = ...;
response.getStringHeaders().putSingle(HttpHeaders.CONTENT_TYPE, "text/plain");
T resp = response.readEntity(respType);

【讨论】:

非常感谢!第二个解决方案对我很有帮助。

以上是关于Jersey:如何将 MediaType 设置为 javax.ws.rs.core.Response,如果真正的“物理”响应标头没有任何相关信息的主要内容,如果未能解决你的问题,请参考以下文章

Jersey REST 客户端 - 将自定义 MediaType 视为 MediaType.APPLICATION_JSON

如何使用 Jersey API 从 RESTful Web 服务发送和接收 JSON 数据

Jersey 2.x 使用 Pojo 作为 POST 的参数

如何将PNG图像从Jersey REST服务方法返回到浏览器

如何在不手动转换为 JSON 的情况下使用 Jersey 客户端发布 Pojo?

Java Rest Jersey:发布多种类型的数据(文件和JSON)