当我向服务器发送请求时
...
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。有什么办法可以告诉泽西岛吗?
最佳答案
尝试通过调用Accept
将WebTarget#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/