我有一个球衣客户端,我试图解组一个响应实体。问题是远程Web服务发送回application / octet-stream作为内容类型,因此Jersey不知道如何解组它(我有类似的错误,text / html回来用于XML等)。我无法更改网络服务。
我想要做的是覆盖内容类型并将其更改为application / json,以便jersey知道要使用哪个编组器。
我无法使用json marshaller注册application / octet-stream,因为对于给定的内容类型,我实际上可能会找回各种奇怪的内容。
答案 0 :(得分:5)
正如laz所指出的,ClientFilter是要走的路:
client.addFilter(new ClientFilter() {
@Override
public ClientResponse handle(ClientRequest request) throws ClientHandlerException {
request.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, "application/json");
return getNext().handle(request);
}
});
答案 1 :(得分:1)
我不熟悉Jersey客户端API,但您可以使用ClientFilter
来执行此操作吗?也许您可以通过ClientRequest.getProperties().put(String, Object)
向请求添加一个属性,该属性告诉ClientFilter
Content-Type
覆盖响应的内容。如果ClientFilter
找到override属性,它会使用它,否则它不会改变响应。我不确定在任何解组之前是否调用了ClientFilter
。希望它是!
编辑(您尝试过这样的事情):
public class ContentTypeClientFilter implements ClientFilter {
@Override
public ClientResponse handle(ClientRequest request) throws ClientHandlerException {
final ClientResponse response = getNext().handle(request);
// check for overridden ContentType set by other code
final String overriddenContentType = request.getProperties().get("overridden.content.type");
if (overriddenContentType != null) {
response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, overriddenContentType);
}
return response;
}
}
答案 2 :(得分:1)
在Java 8和Jersey 2下,您可以使用lambda:
client.register((ClientResponseFilter) (requestContext, responseContext) ->
responseContext.getHeaders().putSingle("Content-Type", "application/json"));