RequestContextHolder.getRequestAttributes() 返回结果是null, 可能是什么原因呢
时间: 2023-08-17 20:45:54 浏览: 159
RequestContextHolder.getRequestAttributes() 返回null可能是因为当前线程没有绑定请求上下文,或者绑定的请求上下文已经被销毁。在一些异步场景下,请求上下文可能无法在子线程中被正确继承,导致在子线程中调用该方法时返回null。此时可以考虑在子线程中手动传递请求上下文,或者使用线程池的方式来管理线程。另外,如果你是在非web环境下调用该方法,比如在测试代码中,也会导致该方法返回null。
相关问题
RequestContextHolder.getRequestAttributes()
RequestContextHolder.getRequestAttributes()是一个用于获取当前线程中的请求属性的方法。然而,在某些情况下,当使用parallelStream等并行操作时,会导致RequestContextHolder.getRequestAttributes()返回null,从而引发空指针异常。这是因为保存requestAttributes的对象是线程隔离的ThreadLocal对象,而并行操作可能会开启子线程,而子线程不会自动调用setRequestAttributes方法来初始化RequestContextHolder。因此,解决这个问题的方法是在开启子线程时手动调用setRequestAttributes方法来设置请求属性。 [1][2][3<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Spring Boot 拦截器+kibana 配置.zip](https://download.csdn.net/download/hanghangaidoudou/11665252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [RequestContextHolder.getRequestAttributes()空指针](https://blog.csdn.net/weixin_43838174/article/details/129580675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
(ServletRequestAttributes)RequestContextHolder.getRequestAttributes().getResponse()
回答: 在代码(ServletRequestAttributes)RequestContextHolder.getRequestAttributes().getResponse()中,会报空指针异常java.lang.NullPointerException: null。原因是getRequestAttributes()方法返回的是null,而getResponse()方法需要一个非空的ServletRequestAttributes对象作为参数。为了解决这个问题,可以参考第二种解决办法,在开启新线程之前,将RequestAttributes对象设置为子线程共享。具体做法是在开启新线程之前添加以下代码:
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(sra, true);\[2\]这样就可以在新线程中获取到非空的ServletRequestAttributes对象,进而调用getResponse()方法。
#### 引用[.reference_title]
- *1* [RequestContextHolder.getRequestAttributes()空指针](https://blog.csdn.net/weixin_43838174/article/details/129580675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [RequestContextHolder.getRequestAttributes()子线程获取问题](https://blog.csdn.net/ypp91zr/article/details/114395178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [Feign拦截器中获取RequestContextHolder.getRequestAttributes()为空问题排查](https://blog.csdn.net/chengpei147/article/details/121385433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]