SpringBoot SimpleThreadScope不会将存储对象从筛选器保留到RestController
我必须获取请求Http头的语言并将其存储在线程上下文中,以SpringBoot SimpleThreadScope不会将存储对象从筛选器保留到RestController,spring,filter,controller,threadscope,Spring,Filter,Controller,Threadscope,我必须获取请求Http头的语言并将其存储在线程上下文中,以RestController,服务可以使用SimpleThreadScope获取它们。但是我发现,@RestController无法获取存储的对象,我将创建一个新实例。我检查了从@RestController到@service是否正常。但无法通过SimpleThreadScope安装的具有线程作用域的bean将对象从筛选器传输到@RestController 为什么由SimpleThreadScope实现的作用域不能从筛选器(Generi
RestController
,服务可以使用SimpleThreadScope
获取它们。但是我发现,@RestController
无法获取存储的对象,我将创建一个新实例。我检查了从@RestController
到@service
是否正常。但无法通过SimpleThreadScope
安装的具有线程作用域的bean将对象从筛选器传输到@RestController
为什么由
SimpleThreadScope
实现的作用域不能从筛选器(GenericFilterBean
)传输到控制器(@RestController
)
@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return new BeanFactoryPostProcessor() {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
logger.info("postprocessor");
beanFactory.registerScope("thread", new SimpleThreadScope());
}
};
}
@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);
}
}
@RequestScope
可能对您有用
同样,拦截器也可以用于你的任务。如果您需要能够从过滤器中更新bean的状态,然后能够读取
@RestController
或@Service
中的值,并使用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());
}
};
}
@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);
}
}
@RequestScope
可能对您有用
同样,拦截器也可以用于你的任务。请参阅本文中的示例在我提出此问题之前,我已配置了类似的指南。您是否使用SimpleThreadScope将值从筛选器传递到rest控制器?如果您这样做了,您将看到您所想的不同。bean被注入到过滤器和控制器中。在过滤器中设置bean的某些属性,在控制器中读取该属性。顺便说一下,你可以用拦截器代替过滤器是的,拦截器可以。我认为filter的线程和Controller的线程是不同的,因此我无法将本地线程值从filter传递到Controller。在我问这个问题之前,我配置了类似的指南。您是否使用SimpleThreadScope将值从筛选器传递到rest控制器?如果您这样做了,您将看到您所想的不同。bean被注入到过滤器和控制器中。在过滤器中设置bean的某些属性,在控制器中读取该属性。顺便说一下,你可以用拦截器代替过滤器是的,拦截器可以。我认为filter的线程和Controller的线程是不同的,所以我不能将本地线程值从filter传递到Controller。