在基于RestEasy的服务中使用服务器请求和响应过滤器进行ThreadLocal存储

时间:2015-09-29 22:43:00

标签: jersey jax-rs resteasy thread-local

我目前正致力于基于RESTeasy的RESTful服务。我有一个过滤器类,它充当服务器请求过滤器以及服务器响应过滤器(即它实现ContainerRequestFilterContainerResponseFilter接口)。

在请求开始时,我使用过滤器将对象放入ThreadLocal。整个请求中的资源使用此对象。在请求结束时,在发送响应之前,过滤器会从ThreadLocal中删除对象。

我的问题是,是否保证请求过滤器,资源和响应过滤器都将在同一个线程中执行?是否有可能在请求过滤器将对象放入ThreadLocal后,另一个线程将执行请求(因此无法访问该对象)?

我确信情况就是这样,但后来我看到了这个http://jersey.576304.n2.nabble.com/Does-filter-method-of-ContainerRequestFilter-run-in-resource-method-thread-td7582648.html(官方泽西岛论坛),现在我有疑虑。

1 个答案:

答案 0 :(得分:2)

  

javax.ws.rs.container.ContainerRequestContext.setProperty(...)

  

javax.ws.rs.container.ContainerRequestContext.getProperty(...)

可能是正确的方法。 javadoc声明:

  

在Servlet容器中,属性与ServletRequest同步,并公开ServletRequest中可用的所有属性。对属性的任何修改也会反映在关联的ServletRequest的属性集中。