如何覆盖泽西客户端中的响应头

时间:2011-07-18 12:49:02

标签: json rest jersey

我有一个球衣客户端,我试图解组一个响应实体。问题是远程Web服务发送回application / octet-stream作为内容类型,因此Jersey不知道如何解组它(我有类似的错误,text / html回来用于XML等)。我无法更改网络服务。

我想要做的是覆盖内容类型并将其更改为application / json,以便jersey知道要使用哪个编组器。

我无法使用json marshaller注册application / octet-stream,因为对于给定的内容类型,我实际上可能会找回各种奇怪的内容。

3 个答案:

答案 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"));