Исключение NPE Nullpointer в весеннем веб-потоке - PullRequest
2 голосов
/ 07 июня 2019

Я получаю странную ошибку в весеннем веб-потоке.

2019-06-07 15:04:39.026 ERROR 29470 --- [nio-8096-exec-8] o.a.c.c.C.[.[.[.[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
    at org.springframework.webflow.execution.repository.support.AbstractFlowExecutionRepository.getConversation(AbstractFlowExecutionRepository.java:170) ~[spring-webflow-2.4.4.RELEASE.jar:2.4.4.RELEASE]
    at org.springframework.webflow.execution.repository.support.AbstractFlowExecutionRepository.getLock(AbstractFlowExecutionRepository.java:125) ~[spring-webflow-2.4.4.RELEASE.jar:2.4.4.RELEASE]
    at org.springframework.webflow.executor.FlowExecutorImpl.launchExecution(FlowExecutorImpl.java:142) ~[spring-webflow-2.4.4.RELEASE.jar:2.4.4.RELEASE]
    at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:263) ~[spring-webflow-2.4.4.RELEASE.jar:2.4.4.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) ~[spring-webmvc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) ~[tomcat-embed-core-8.5.23.jar:8.5.23]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.23.jar:8.5.23]

Это происходит внутри весенней библиотеки webflow, и я совершенно не знаю, почему. Мой поток выглядит так:

<action-state id="checkProductAvailable">
       <evaluate expression="knowledgeSourceService.test(requestParameters.productUUid, requestParameters._eventId)"/>
           <transition on="internet" to="validateAndProceedToSummary">
               <evaluate expression="knowledgeSourceService.extractCustomerSelectedSourceFromRequest(requestParameters)"
                         result="flowScope.customerSelectedSource"/>
               <evaluate expression="knowledgeSourceService.enhanceProductData(requestParameters.productUUid)"
                         result="conversationScope.selectedProduct"/>
           </transition>
           <transition on="requireProducts" to="products" />
   </action-state>


   <decision-state id="validateAndProceedToSummary">
    <if test="knowledgeSourceService.updateCustomerSelection(flowScope.customerSelectedSource, flowScope.productList.selectedProduct.customerSelectedSource)"
        then="proceedToSummary" else="invalidateFormState"/>
</decision-state>

Когда я меняю переход с validateAndProceedToSummary на products, он работает без ошибок. Но с этим validateAndProceedToSummary состоянием решения оно терпит неудачу.

products - это состояние просмотра:

<view-state id="products" view="invest-flow-products" model="productList">

Можете ли вы помочь мне?

knowledgeSourceService.updateCustomerSelection(flowScope.customerSelectedSource, flowScope.productList.selectedProduct.customerSelectedSource)

вызывает метод:

public boolean updateCustomerSelection(String old, String new) {

Но, насколько я вижу, этот метод (точка прерывания) не будет достигнут для успешного пути (proceedToSummary). Достигается только при сбое пути (invalidateFormState). Так что какое-то предварительное условие не заполнено. Но не знаю какой. Можем ли мы как-то это отладить?

1 Ответ

0 голосов
/ 10 июня 2019

Если updateCustomerSelection () возвращает логическое значение оболочки, то нам нужно проверить нулевое значение, так как возможно, что логическое значение оболочки также может содержать нулевое значение.

Ниже код должен решить проблему NPE:

if (null != updateCustomerSelection() && updateCustomerSelection()) {
    //code
}

или, если вы используете библиотеку Apache Commons, вы можете написать, как показано ниже:

if (BooleanUtils.isTrue(updateCustomerSelection())) {
     //code
}
...