原文: 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 instanceResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();//Add user into context data mapfactory.pushContext(User.class, user);
2)从上下文映射中获取数据
第一步取回数据集非常简单。 使用popContextData()方法。 该上下文数据本质上是线程局部的,因此在代码的另一个位置进行检索时,您不必担心会得到错误的数据。
ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();factory.popContextData(User.class);
这样,您可以使用ResteasyProviderFactory在应用的多个层之间共享数据。
学习愉快!
