6

我目前正在实现一个 Web 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-变通办法.aspx

4. Only text/plain is supported for the request's Content-Type header

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

4

1 回答 1

2

嗯,你指向的链接说它只适用于请求。因此,您只能接受纯文本,但可以自由生成您想要的任何内容。

编辑尝试使用类似的代码注册一个自定义响应过滤器(也许你已经这样做了?):

@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<>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);
    }
}
于 2012-11-20T16:44:08.953 回答