Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回响应后,RequestContextHolder中设置的属性丢失_Java_Spring_Spring Boot - Fatal编程技术网

Java 返回响应后,RequestContextHolder中设置的属性丢失

Java 返回响应后,RequestContextHolder中设置的属性丢失,java,spring,spring-boot,Java,Spring,Spring Boot,我在SpringBoot中公开了一个服务,并且在RequestContextHolder中存储了一些属性。在我的一个API中,我必须异步执行一些活动。应用程序接受一个请求并创建一个新线程来执行该活动,并立即返回响应。我还将RequestContextHolder对象传递给线程。线程尝试从RequestContextHolder获取属性,并且在发送响应后它看起来是空的。如果在线程完成执行后返回响应,则该值在线程中可用。我假设RequestContextHolder与HTTPRequest绑定,并且

我在SpringBoot中公开了一个服务,并且在RequestContextHolder中存储了一些属性。在我的一个API中,我必须异步执行一些活动。应用程序接受一个请求并创建一个新线程来执行该活动,并立即返回响应。我还将RequestContextHolder对象传递给线程。线程尝试从RequestContextHolder获取属性,并且在发送响应后它看起来是空的。如果在线程完成执行后返回响应,则该值在线程中可用。我假设RequestContextHolder与HTTPRequest绑定,并且在返回响应时丢失。我的假设正确吗?如果是,我如何处理这种情况


Spring引导应用程序RequestContextFilter中的org.springframework.web.context.request.RequestContextHolder将请求设置为RequestContextHolder,并将其存储为线程局部变量,并在控制器返回后将其清除。将RequestContextHolder用作另一个线程的参数是不正确的,因为它的内容在处理过程中可能会更改


RequestContextHolder.getRequestAttributes在启动新的并发任务之前使用实际请求,它包含所有属性集,只是一个普通对象,下面没有ThreadLocal。

请求存储在ThreadLocal变量中,因此在执行异步任务时,该变量可以有另一个请求,也可以没有请求。只需在执行之前获得所需的属性并传递到您的任务。谢谢@yevhenimelnyk。那么,当返回响应时,变量会被销毁吗?是的,在处理请求后调用RequestContextHolder.resetRequestAttributes。默认情况下,在Spring Boot应用程序中,RequestContextFilter对此负责。谢谢@Yevhenimelnyk。我创建了一个线程局部变量并存储了所需的值。如果你能把它作为答案发布,我会接受的。我不明白你的意思,但是在处理来自另一个线程的数据时使用threadlocal存储任何东西是不安全的。只需在执行前获取参数并将其传递给执行任务的构造函数即可。或者使匿名可调用,并将其用作已检索值(而不是ThreadLocal)的结尾。您还可以从控制器返回可调用的jsut,spring将异步处理结果。如果您能告诉我使用了什么样的异步执行以及它的用途,这会有所帮助。非常感谢@Yevhenii Melnyk。谢谢你对我的回答的回复。我正在尝试运行测试,运行后将请求您的帮助。