在JAX-RS(RestEasy)调用期间添加上下文信息(firstname / lastname)

时间:2013-09-17 07:32:31

标签: java-ee ejb jax-rs cdi resteasy

@Provider
@ServerInterceptor
public class AuthInterceptor implements PreProcessInterceptor {...}

我已经构建了上面的拦截器,其中:

  1. 从HttpServletRequest中的标头字段中检索用户的ID。
  2. 使用用户ID从数据库加载用户实体。
  3. 在@RequestScoped CDI bean中存储来自实体的用户信息(名字/ dob / etc)。
  4. 这样做的原因是让用户的信息可用于所有正在进行的Session bean调用(使用@Inject注释)。

    这是有效的,但是有些情况(例如在@Asynchronous方法调用中)CDI没有注入@RequestScoped bean(而是给出了null引用)。

    我也看过使用

    的例子
    InvocationContext.getContextData().put("user-related-data-name", someObj)
    

    然而这似乎不起作用,在将用户数据放入地图后获取用户数据总是返回空指针。

    在拦截器调用期间添加此用户信息的最佳方法是什么,以便在所有后续请求EJB调用中都可用?

    提前致谢。

1 个答案:

答案 0 :(得分:0)

如果其他人发现同样的问题,这里是我的解决方案的摘要:

我想知道是否有JavaEE方式这样做,而是我只是将上下文信息存储在线程本地而不是Request Scoped bean中。

当我分叉一个新线程时,我有一个拦截器,它接收当前上下文信息并将其存储在本地新线程中,因此用户的上下文信息可用于原始线程和新线程。 / p>

请注意,还有一些拦截器可以在不再需要时清除本地线程的值。

有关本地线程的讨论,请参阅此处:When and how should I use a ThreadLocal variable?