当我向服务器发送请求时

...
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);
...


球衣在最后一行抛出异常:

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。

我认为,这就是问题所在。泽西岛无法检测到响应的MediaType并默认设置(“应用程序/八位字节流”)。但实际上,我的回应是XML。有什么办法可以告诉泽西岛吗?

最佳答案

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

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);

关于java - Jersey :如何将MediaType设置为javax.ws.rs.core.Response,如果实际的“物理”响应头没有任何相关信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20124001/

10-12 14:12