0

我必须获取请求 Http Header 的语言并存储在线程上下文中RestController,服务可以通过使用SimpleThreadScope. 但我发现,@RestController无法获取存储的对象,我将创建一个新实例。我查了一下,从@RestController到没@service问题。但是不能通过@RestControllerSimpleThreadScope.

为什么 Scope 实现的SimpleThreadScope不能从 Filter( GenericFilterBean) 转移到 Controller( @RestController)。

4

1 回答 1

5

如果您需要能够从过滤器更新 bean 的状态,然后能够读取@RestControlleror中的值,然后@Service使用SimpleThreadScope

  1. 你需要注册 SimpleThreadScope

    @Bean
    public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
        return new BeanFactoryPostProcessor() {
            @Override
            public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
                logger.info("postprocessor");
                beanFactory.registerScope("thread", new SimpleThreadScope());
            }
        };
    }
    
  2. 你应该用 @Scope("thread") 注释你的 bean

    @Component
    @Scope(scopeName = "thread", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public class MyBean {
    
    
    @RestController
    public class SampleController {
        private static final Logger logger = LoggerFactory.getLogger(SampleController.class);
    
        @Autowired
        private MyBean myBean;
    
        @GetMapping("/test/{somePathVar}")
        public String test(@PathVariable String somePathVar) throws InterruptedException, ExecutionException {
            logger.info("looking for bean data: {}", myBean.getData());
    
  3. 在过滤器中注入 bean 并更新它的状态

    @Component
    public class MyFilter extends GenericFilterBean {
        private static final Logger logger = LoggerFactory.getLogger(MyFilter.class);
    
        @Autowired
        private MyBean myBean;
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            myBean.setData(servletRequest.getParameter("test"));
    
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
    

这是一篇描述春季作用域的有用文章:http ://www.baeldung.com/spring-bean-scopes 。您可以在此处找到有关 proxyMode 的详细信息。

您可以看到这@RequestScope可能对您有用。

也可能拦截器会为你的任务工作。请参阅本文中的示例http://www.baeldung.com/spring-http-logging

于 2018-01-07T08:18:47.673 回答