原文: https://howtodoinjava.com/resteasy/share-context-data-with-jax-rs-resteasyproviderfactory/

    很多时候,我们不得不将数据从应用传递到多层。 使用拦截器的应用就是一个例子。 假设我们的应用中有两个拦截器,一个用于登录检查,另一个用于将审计信息放入数据库。 我们要使用 User 对象从第一个拦截器进入第二个拦截器。

    在基于 RESTEasy 的应用中,可以使用ResteasyProviderFactory实例轻松实现上述功能。 通过使用以下定义在web.xml文件中添加过滤器,可以启用ResteasyProviderFactory

    1. <listener>
    2. <listener-class>
    3. org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
    4. </listener-class>
    5. </listener>

    现在,您可以在 RESTEasy 上下文范围内的任何类中轻松获取ResteasyProviderFactory的实例。 因此,要在拦截器之间共享数据,您将需要执行两个步骤:

    1)在上下文映射中设置数据

    使用pushContext()方法设置此上下文数据。 此方法将数据添加到定义为以下内容的线程本地栈中:

    1. protected static ThreadLocalStack<Map<Class<?>, Object>> contextualData
    2. = new ThreadLocalStack<Map<Class<?>, Object>>();

    您需要按以下方式推送数据:

    1. User user = new User();
    2. //Set some user attributes
    3. //Get registered ResteasyProviderFactory instance
    4. ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
    5. //Add user into context data map
    6. factory.pushContext(User.class, user);

    2)从上下文映射中获取数据

    第一步取回数据集非常简单。 使用popContextData()方法。 该上下文数据本质上是线程局部的,因此在代码的另一个位置进行检索时,您不必担心会得到错误的数据。

    1. ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
    2. factory.popContextData(User.class);

    这样,您可以使用ResteasyProviderFactory在应用的多个层之间共享数据。

    学习愉快!