在 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记录请求
我应该将@ConfigProperty 字段包装在 javax.enterprise.inject.Instance 对象中吗?