# RESTEasy - 与`ResteasyProviderFactory`共享上下文数据

> 原文： [https://howtodoinjava.com/resteasy/share-context-data-with-jax-rs-resteasyproviderfactory/](https://howtodoinjava.com/resteasy/share-context-data-with-jax-rs-resteasyproviderfactory/)

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

在基于 [**RESTEasy**](//howtodoinjava.com/restful-web-service/ "Resteasy tutorials") 的应用中，可以使用[`ResteasyProviderFactory`](https://github.com/jharting/resteasy/blob/master/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/ResteasyProviderFactory.java "ResteasyProviderFactory source code")实例轻松实现上述功能。 通过使用以下定义在`web.xml`文件中添加过滤器，可以启用`ResteasyProviderFactory`：

```java
<listener>
  <listener-class>
	 org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
  </listener-class>
</listener>

```

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

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

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

```java
protected static ThreadLocalStack<Map<Class<?>, Object>> contextualData 
						= new ThreadLocalStack<Map<Class<?>, Object>>();

```

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

```java
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()`方法。 该上下文数据本质上是线程局部的，因此在代码的另一个位置进行检索时，您不必担心会得到错误的数据。

```java
 ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
 factory.popContextData(User.class);

```

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

学习愉快！