java - 为什么 HttpServletRequest 在 collection.parallelStream() 中为 null

标签 java spring-boot

我使用的是 spring-boot 1.2.7,在尝试在 parallelStream().forEach(o -> addAddtionalData(id)) 中使用它时遇到了 NullPointerException,但是 Stream() 可以,我认为这可能是一个线程问题,但我无法很好地解释它,有人可以帮助指导我吗?

private void addAddtionalData(Long id){

    // request is null but not the first time loop in parallel stream
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    boolean isSecure = request.isSecure();    
    // some code 
}

异常(exception):

[ERROR] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for 
servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException: null
java.lang.NullPointerException: null
     at com.app.service.QuoteService.setAdditionalData(QuoteService.java:103) ~[classes/:na]
     at com.app.service.QuoteService.lambda$getAllQuotes$41(QuoteService.java:80) ~[classes/:na]
     at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[na:1.8.0_60]
     at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374) ~[na:1.8.0_60]
     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_60]
     at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291) ~[na:1.8.0_60]
     at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731) ~[na:1.8.0_60]
     at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) ~[na:1.8.0_60]
     at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) ~[na:1.8.0_60]
     at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) ~[na:1.8.0_60]
     at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) ~[na:1.8.0_60]

最佳答案

RequestContextHolder使用 ThreadLocal 来查找上下文对象。

Holder class to expose the web request in the form of a thread-bound RequestAttributes object.

使用并行流意味着您的代码在不同的线程中运行,因此没有上下文对象。

您应该在开始流处理之前获取 isSecure 值。

关于java - 为什么 HttpServletRequest 在 collection.parallelStream() 中为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38649721/

相关文章:

java - 如何通过 Autowired 注入(inject)具有不同配置的不同 ObjectMappers?

spring - AuthenticationManagerBuilder 和 HttpSecurity.authenticationProvider 之间的区别

java - 错误 : operator does not exist: bigint = character varying for empty list of long

java - 从 Java 6 + Tomcat 6 升级到 Java 8 + Tomcat 8 时垃圾收集器的使用

java - 如何将文本打印到文本区域

java - android 9 中的错误 protected doInBackground

java - jcombobox 在拖放中被选中

java - 编写 jax-ws web 服务并生成无 XSD 的 WSDL

java - 使用 sparql 查询向 Fuseki 插入数据

java - Spring Boot应用程序无法启动嵌入式容器