注释资源以生成JSON,但在响应头中返回“text / plain”

时间:2012-11-20 12:14:12

标签: java json spring jersey cors

我目前正在实施网络API

输出(如果有的话)将是JSON,所以我的所有类都使用预期的媒体类型进行注释。

@Produces(MediaType.APPLICATION_JSON)
public class CustomerResource {
    ...
}

这样我的类就会自动转换为 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

因此我需要强制我的应用程序在标题中使用 text / plain 进行响应,但仍然将我的类投影到 json 输出。我知道我添加的CORS类是设置该标题,但不知怎的,我的注释会再次覆盖它,即使我自己添加了另一个过滤器。

1 个答案:

答案 0 :(得分:2)

嗯,你指的链接说只有 REQUESTS 才是真的。 因此,您只能接受纯文本,但可以随意生成您想要的内容。

编辑尝试使用与此类似的代码注册自定义responsefilter(也许您已经这样做过了?):

@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;
  }
}

但是,如果响应已包含此标头,请检查结果以确保没有问题。 否则你可以尝试修改当前的响应,但我不确定你可以,因为它可能是一个不可变的对象。顺便说一句,它看起来不那么干净了。)

List<Object> contentTypes = response.getHttpHeaders().get(HttpHeaders.CONTENT_TYPE);
contentTypes.clear();
contentTypes.add("text/plain");

另外,对于json&lt;&gt; java数据库,您可以检查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);
    }
}