RESTEasy - 与ResteasyProviderFactory共享上下文数据

RESTEasy - 与ResteasyProviderFactory共享上下文数据

原文: 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在应用的多个层之间共享数据。

学习愉快!