在 ContainerResponseFilter (JAX-RS 2) 中获取响应

Posted

技术标签:

【中文标题】在 ContainerResponseFilter (JAX-RS 2) 中获取响应【英文标题】:Getting Response in ContainerResponseFilter's (JAX-RS 2) 【发布时间】:2013-07-26 16:03:31 【问题描述】:

我正在尝试将 this CORS filter 移植到 JAX-RS 2。

但是,我看不到如何从 ContainerResponseContext 中获取 Response 对象(如旧代码中),我在 ContainerResponseFilter 的覆盖方法中传递。

如果有一种更优雅的方式来使用 JAX-RS 2 进行 CORS,那当然是更可取的。提前致谢。

【问题讨论】:

【参考方案1】:

三个响应可以直接访问作为ContainerResponseContext

@Provider
public class ResponseCorsFilter implements ContainerResponseFilter

    @Override
    public void filter(ContainerRequestContext requestContext,
            ContainerResponseContext responseContext) throws IOException 
           responseContext.getHeaders()
                .putSingle("Access-Control-Allow-Origin","*");
           responseContext.getHeaders()
                 .putSingle("Access-Control-Allow-Methods",
                     "GET, POST, PUT, DELETE");
           List<String> reqHead=requestContext.getHeaders()
                     .get("Access-Control-Request-Headers");
           if(null != reqHead)
                responseContext.getHeaders()
                   .put("Access-Control-Allow-Headers", 
                        new ArrayList<Object>(reqHead));
           
    


【讨论】:

但是使用这个我怎么能得到我的回应 BODY ? ContainerResponseContext.setEntity 方法允许替换整个实体。 谢谢...我可以对ContainerRequestContext 进行反向操作吗?我的意思是我想从过滤器中的ContainerRequestContext 获取 POJO。从ContainerRequestContext,我们可以得到EntityStream,但我想要Entity,因为我们得到ContainerResponseContext ContainerResponseContext.getEntity(),根据api,它可以满足您的需求。 无法使用这种类型的过滤器获取对象,因为它绑定到请求/响应循环的外层。你需要的可能是实现一个ReaderInterceptor,并使用ReaderInterceptorContext的方法proceed(),传递给aroundReadFrom

以上是关于在 ContainerResponseFilter (JAX-RS 2) 中获取响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的过滤器上过滤特定的URL以实现ContainerRequestFilter和ContainerResponseFilter?

ContainerRequestFilter ContainerResponseFilter 没有被调用

ContainerRequestFilter 和 ContainerResponseFilter 线程安全吗?

使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求

cxf jaxrs 等效于球衣 @NameBinding

我应该将@ConfigProperty 字段包装在 javax.enterprise.inject.Instance 对象中吗?