Mat*_*aug 6 java spring json jersey cors
我目前正在实施一个Web API
输出(如果有的话)将是JSON,因此我的所有类都使用预期的媒体类型进行注释.
@Produces(MediaType.APPLICATION_JSON)
public class CustomerResource {
...
}
Run Code Online (Sandbox Code Playgroud)
这样我的类就会自动转换为json.
但...
由于微软,他们的IE只支持CORS,如果请求/响应类型是text/plain http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and- workarounds.aspx
4. Only text/plain is supported for the request's Content-Type header
Run Code Online (Sandbox Code Playgroud)
所以我需要强制我的应用程序在标题中使用text/plain进行响应,但仍然将我的类投影到json输出.我知道我添加的CORS类是设置该标题,但不知何故,我的注释会再次覆盖它,即使我自己添加了另一个过滤器.
嗯,您指向的链接表明它仅适用于请求。因此,您只能接受纯文本,但可以自由地制作您想要的内容。
编辑尝试使用类似的代码注册自定义响应过滤器(也许您已经这样做了?):
@Provider
public class HeaderRewriteFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
response.setResponse(Response
.fromResponse(response.getResponse()).header(HttpHeaders.CONTENT_TYPE, "text/plain").build());
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,请检查结果以确保响应已包含此标头时没有问题。否则,您可以尝试修改当前响应,但我不确定您可以,因为它可能是一个不可变的对象。顺便说一句,它对我来说看起来不太干净:)
List<Object> contentTypes = response.getHttpHeaders().get(HttpHeaders.CONTENT_TYPE);
contentTypes.clear();
contentTypes.add("text/plain");
Run Code Online (Sandbox Code Playgroud)
另外,为了进行 json<>java databiding,您可以检查 Genson 库http://code.google.com/p/genson/,它与 Jersey 集成得很好。只需将 jar 放入类路径中并运行即可!
编辑 2好的,那么您必须以其他方式执行此操作,使用生成“text/plain”并为该类型定义一个 json bodywriter。缺点是你只能生成 json。使用 Genson,你可以这样做:
@Provider
@Produces({ MediaType.TEXT_PLAIN })
public class PlainTextJsonConverter extends GensonJsonConverter {
public GensonJsonConverter() {
super();
}
public GensonJsonConverter(@javax.ws.rs.core.Context Providers providers) {
super(providers);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3505 次 |
| 最近记录: |