2016-07-29 4 views
1

Я использовал spring-boot 1.2.7, я встретил исключение NullPointerException при попытке использовать это в parallelStream().forEach(o -> addAddtionalData(id)), но stream() в порядке, я думаю, что это может быть проблема с потоком, но Я не могу объяснить это хорошо, может ли кто-нибудь помочь мне помочь?Почему HttpServletRequest имеет значение null в коллекции.parallelStream()

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 
} 

Исключение:

[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] 

ответ

1

RequestContextHolder использует ThreadLocal найти объект контекста.

держатель класс подвергать веб-запрос в виде резьбы связанногоRequestAttributes объекта.

Использование параллельных потоков означает, что ваш код работает в другом потоке, поэтому нет контекстного объекта.

Перед началом обработки потока вы должны получить значение isSecure.

+0

большое спасибо! –

Смежные вопросы