多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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`在应用的多个层之间共享数据。 学习愉快!