SpringBoot SimpleThreadScope不会将存储对象从筛选器保留到RestController

SpringBoot SimpleThreadScope不会将存储对象从筛选器保留到RestController,spring,filter,controller,threadscope,Spring,Filter,Controller,Threadscope,我必须获取请求Http头的语言并将其存储在线程上下文中,以RestController,服务可以使用SimpleThreadScope获取它们。但是我发现,@RestController无法获取存储的对象,我将创建一个新实例。我检查了从@RestController到@service是否正常。但无法通过SimpleThreadScope安装的具有线程作用域的bean将对象从筛选器传输到@RestController 为什么由SimpleThreadScope实现的作用域不能从筛选器(Generi

我必须获取请求Http头的语言并将其存储在线程上下文中,以
RestController
,服务可以使用
SimpleThreadScope
获取它们。但是我发现,
@RestController
无法获取存储的对象,我将创建一个新实例。我检查了从
@RestController
@service
是否正常。但无法通过
SimpleThreadScope
安装的具有线程作用域的bean将对象从筛选器传输到
@RestController


为什么由
SimpleThreadScope
实现的作用域不能从筛选器(
GenericFilterBean
)传输到控制器(
@RestController

  • 您需要注册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());
            }
        };
    }
    
  • 您应该用@Scope(“线程”)注释bean

  • 在过滤器中注入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);
        }
    }
    
  • 下面是一篇描述spring中作用域的有用文章:。您可以在那里找到有关proxyMode的详细信息

    您可以看到,
    @RequestScope
    可能对您有用


    同样,拦截器也可以用于你的任务。如果您需要能够从过滤器中更新bean的状态,然后能够读取
    @RestController
    @Service
    中的值,并使用
    SimpleThreadScope
    ,请参阅本文中的示例

  • 您需要注册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());
            }
        };
    }
    
  • 您应该用@Scope(“线程”)注释bean

  • 在过滤器中注入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);
        }
    }
    
  • 下面是一篇描述spring中作用域的有用文章:。您可以在那里找到有关proxyMode的详细信息

    您可以看到,
    @RequestScope
    可能对您有用


    同样,拦截器也可以用于你的任务。请参阅本文中的示例

    在我提出此问题之前,我已配置了类似的指南。您是否使用SimpleThreadScope将值从筛选器传递到rest控制器?如果您这样做了,您将看到您所想的不同。bean被注入到过滤器和控制器中。在过滤器中设置bean的某些属性,在控制器中读取该属性。顺便说一下,你可以用拦截器代替过滤器是的,拦截器可以。我认为filter的线程和Controller的线程是不同的,因此我无法将本地线程值从filter传递到Controller。在我问这个问题之前,我配置了类似的指南。您是否使用SimpleThreadScope将值从筛选器传递到rest控制器?如果您这样做了,您将看到您所想的不同。bean被注入到过滤器和控制器中。在过滤器中设置bean的某些属性,在控制器中读取该属性。顺便说一下,你可以用拦截器代替过滤器是的,拦截器可以。我认为filter的线程和Controller的线程是不同的,所以我不能将本地线程值从filter传递到Controller。