背景:springboot 的 web项目
现象:HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
报空指针异常,java.lang.NullPointerException: null。
原因:
在代码中开启了子线程,在子线程使用了该方法。
解析:
1、保存requestAttributes的对象是线程隔离的ThreadLocal对象,当http请求发送到服务端时,每个请求会开启一个线程来处理,由RequestContextListener来初始化RequestContextHolder。
RequestContextHolder.setRequestAttributes(attributes);
当开启了子线程时,不会自动调用setRequestAttributes方法,所以从ThreadLocal中获取时为null
解决:
1、主线程获取,传递给子线程