我正在尝试使用 Jersey 客户端 API 来使用第三方 REST 服务。我计划使用自动 POJO 反序列化从 JSON 响应转到 Java 对象。
不幸的是,第三方服务使用 content type 返回响应"text/javascript"
。我的 Jersey 客户端无法理解这应该被视为 JSON 对象并且无法反序列化该对象。
我编写了一个简单的 Jersey 服务器应用程序,通过将内容类型更改为反序列化工作来验证这"text/javascript"
一点"application/json"
。
有了这些信息,我开始使用 Jersey 客户端过滤器来修改响应标头。代码来自这个问题的作者的评论。事实上,这个问题似乎和我的完全一样——但是回答者错误地回答了这个问题,并展示了如何修改请求标头(而不是响应标头)。原作者能够使用答案来创建他的解决方案,但是,他陈述的解决方案似乎无法正常工作。
过滤器代码为:
client.addFilter(new ClientFilter() {
@Override public ClientResponse handle(ClientRequest cr)
throws ClientHandlerException {
ClientResponse response = getNext().handle(cr);
response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
return response;
}
});
然而,当执行时,UnsupportedOperationException
会引发 an:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.clear(Collections.java:1035)
at com.sun.jersey.core.util.StringKeyIgnoreCaseMultivaluedMap.putSingle(StringKeyIgnoreCaseMultivaluedMap.java:78)
at com.sun.jersey.core.util.StringKeyIgnoreCaseMultivaluedMap.putSingle(StringKeyIgnoreCaseMultivaluedMap.java:56)
at App$1.handle(App.java:49)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:507)
at App.main(App.java:63)
返回的标头似乎包含在不可修改的集合中。
然后我尝试将所有标头复制到一个新集合中,但是我看不到将标头映射设置回响应中。
最后,我想也许我可以创建一个ClientResponse
包含修改后的标题的新标题。但是,构造函数ClientResponse
具有以下签名:
public ClientResponse(int status,
InBoundHeaders headers,
InputStream entity,
MessageBodyWorkers workers)
从原始复制status
,headers
和变量是微不足道的。entity
但是,我看不出获得对该workers
领域的引用。
如何使用 Jersey 客户端过滤器将响应标头从"text/javascript"
to修改,"application/json"
以便我的 POJO 反序列化可以工作?