我正在尝试返回HTTP响应,然后继续处理。
我使用注释@EnableAsync
在我的控制器课程中:
@GetMapping(path = "/{key}/process")
public ProcessStatus processData(@PathVariable String key) {
dataService.processData(key); //async call
return new ProcessStatus(true);
}
在我的服务班级:
@Async
public void processData(String key) {
processDataUsingDB(key);
}
我最初收到错误消息
未找到线程绑定请求:您是在实际Web请求之外引用请求属性,还是在原始接收线程之外处理请求?如果您实际上是在Web请求中操作并且仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求。
所以我添加了以下配置:
@Bean
public DispatcherServlet dispatcherServlet() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setThreadContextInheritable(true);
return dispatcherServlet;
}
@Bean
public ServletRegistrationBean dispatcherServletRegistration() {
ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet());
registration.setLoadOnStartup(0);
registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
return registration;
}
现在我得到了错误
“范围'request'在当前线程中不活动;如果您打算从单例中引用它,请考虑为此bean定义作用域代理;嵌套异常为java.lang.IllegalStateException:无法请求请求属性-该请求不再有效!“
任何人都可以共享一个示例代码来完成这项工作吗? ProcessStatus bean引用范围为request
的UserCredentials bean