原文: https://howtodoinjava.com/resteasy/share-context-data-with-jax-rs-resteasyproviderfactory/
很多时候,我们不得不将数据从应用传递到多层。 使用拦截器的应用就是一个例子。 假设我们的应用中有两个拦截器,一个用于登录检查,另一个用于将审计信息放入数据库。 我们要使用 User 对象从第一个拦截器进入第二个拦截器。
在基于 RESTEasy 的应用中,可以使用ResteasyProviderFactory
实例轻松实现上述功能。 通过使用以下定义在web.xml
文件中添加过滤器,可以启用ResteasyProviderFactory
:
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
现在,您可以在 RESTEasy 上下文范围内的任何类中轻松获取ResteasyProviderFactory
的实例。 因此,要在拦截器之间共享数据,您将需要执行两个步骤:
1)在上下文映射中设置数据
使用pushContext()
方法设置此上下文数据。 此方法将数据添加到定义为以下内容的线程本地栈中:
protected static ThreadLocalStack<Map<Class<?>, Object>> contextualData
= new ThreadLocalStack<Map<Class<?>, Object>>();
您需要按以下方式推送数据:
User user = new User();
//Set some user attributes
//Get registered ResteasyProviderFactory instance
ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
//Add user into context data map
factory.pushContext(User.class, user);
2)从上下文映射中获取数据
第一步取回数据集非常简单。 使用popContextData()
方法。 该上下文数据本质上是线程局部的,因此在代码的另一个位置进行检索时,您不必担心会得到错误的数据。
ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
factory.popContextData(User.class);
这样,您可以使用ResteasyProviderFactory
在应用的多个层之间共享数据。
学习愉快!