2016-01-05 45 views
-1

我有控制器和服務類(Spring和Hibernate 4)。控制器類包含如下所示的方法getTransactionsForInternalUse調查java異常

 @RequestMapping(value = "/internal/financials/transactions", method = RequestMethod.GET) 
      @ResponseBody 
      public ResponseEntity<SetRESTData<FinancialTransactionDTO>> getTransactionsForInternalUse(

      @RequestParam(value = "businessId", required = true) final String businessId, 
      @RequestParam(value = "status", required = false) final String statusString, 
      @RequestParam(value = "transactionMethod", required = false) final String transactionMethodString, 
      @RequestParam(value = "sortBy", required = false) final String orderBy, 
      @RequestParam(value = "sortDirection", required = false) final String sortDirectionString) { 

      final FinancialTransactionStatus status = StringUtils.isBlank(statusString) ? null : FinancialTransactionStatus.fromCode(statusString); 
      final FinancialTransactionMethod method = 
       StringUtils.isBlank(transactionMethodString) ? null : FinancialTransactionMethod.fromCode(transactionMethodString); 

      final FinancialTransactionPaginationData paginationData = StringUtils.isBlank(orderBy) ? 
       null : new FinancialTransactionPaginationData(FinancialTransactionSortableField.fromCode(orderBy), null, null, sortDirectionString); 

//call to getTransactionsForEmployeeUse method 


      final ServiceResultDetails<Set<FinancialTransactionDTO>> resultsDetails = 
    financialTransactionService.getTransactionsForEmployeeUse(businessId,status, method, paginationData);// Added business Id here 
      final ResponseCode errorCode = resultsDetails.getErrorCode(); 
      if (errorCode != null) { 
       return buildNoCacheNoCorsEmptySetRESTDataWithMessage(errorCode, resultsDetails.getErrorMessage()); 
      } else { 
       return buildNoCacheSetRESTDataResponse(
       resultsDetails.getEntity(), ResponseCode.FINANCIAL_TRANSACTION_RETRIEVED, ResponseCode.FINANCIAL_TRANSACTION_NOT_FOUND, false); 
      } 
      } 

而且,FinancialTransactionService類的getTransactionsForEmployeeUse方法是使用它的如上所示的對象financialTransactionService調用。在FinancialTransactionService定義getTransactionsForEmployeeUse 的方法如下:

 @Transactional(value = TransactionManagerName.BUSINESS, readOnly = true) 
     @TransactionalSecurity(employeeAccess = true) 
     public ServiceResultDetails<Set<FinancialTransactionDTO>> getTransactionsForEmployeeUse(
       @NotBlank final String businessExternalId, 
       final FinancialTransactionStatus status, 
       final FinancialTransactionMethod method, 
       final FinancialTransactionPaginationData paginationData) { 
      final Business escrowProvider = businessService.getByExternalId(businessExternalId); 
      final BusinessId escrowProviderId = escrowProvider.getId(); 
      final BusinessPartnership businessPartnership = businessPartnershipService.getPartnership(escrowProviderId); 

//The below line is line #223 from the stacktrace and in the code 
      if (!Boolean.TRUE.equals(businessPartnership.getEscrowProvider())) { 
       return new ServiceResultDetails<>(ResponseCode.OPERATION_NOT_ALLOWED_FOR_NON_ESCROW_PROVIDERS); 
      } 
      final Set<FinancialAccount> accounts = financialAccountService.getAccountsAtHoldingPartner(escrowProviderId); 
      final Map<FinancialAccountId, FinancialAccount> accountIdMap = entityHelper.buildIdEntityMap(accounts); 
      final Set<FinancialTransaction> financialTransactions = 
        financialTransactionDAO.getAllTransactionsForEmployeeUse(status, method, paginationData); 
      final Set<FinancialTransactionDTO> resultsAll = new LinkedHashSet<>(financialTransactions.size()); 
      for (final FinancialTransaction financialTransaction : financialTransactions) { 
       if(financialTransaction instanceof InvestmentTransaction){ 
        final FinancialAccountId fromEscrowAccountId = ((InvestmentTransaction) financialTransaction).getFromEscrowAccountId(); 
        final FinancialAccount fromEscrowAccount = fromEscrowAccountId == null ? null : accountIdMap.get(fromEscrowAccountId); 
        if(fromEscrowAccount != null){ 
         resultsAll.add(new FinancialTransactionDTO(financialTransaction,fromEscrowAccount)); 
        }else{ 
         resultsAll.add(new FinancialTransactionDTO(financialTransaction)); 
        } 
       }else { 
        resultsAll.add(new FinancialTransactionDTO(financialTransaction)); 
       } 
      } 
      return new ServiceResultDetails<>(resultsAll);  
     } 

我已經收到此錯誤,當我運行一個API調用(GET)這幾天使用REST客戶端和前幾天我沒」沒有得到這個錯誤。我沒有做任何代碼更改,並想知道可能是什麼問題。 我嘗試使用遠程Java應用程序調試,但不明白爲什麼NPE是thrown.The堆棧跟蹤低於:

1723:44.616 080-exec-3 LId:2001 PId:2001 r.SessionManagementInterceptor ERROR Uncaught exception from FinancialTransactionsController, getTransactionsForInternalUse 
java.lang.NullPointerException 
    at com.fp.investing.service.transaction.FinancialTransactionService.getTransactionsForEmployeeUse(FinancialTransactionService.java:223) ~[investing-api-1.0.13579.jar:13579] 
    at com.fp.investing.service.transaction.FinancialTransactionService$$FastClassBySpringCGLIB$$dea301d.invoke(<generated>) ~[spring-core-4.2.0.RELEASE.jar:13579] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) ~[spring-tx-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at com.fp.investing.service.transaction.FinancialTransactionService$$EnhancerBySpringCGLIB$$a21fc6da.getTransactionsForEmployeeUse(<generated>) ~[spring-core-4.2.0.RELEASE.jar:13579] 
    at com.fp.investing.service.transaction.FinancialTransactionService$$FastClassBySpringCGLIB$$dea301d.invoke(<generated>) ~[spring-core-4.2.0.RELEASE.jar:13579] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) ~[spring-tx-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at com.fp.core.tx.TransactionalSecurityInterceptor.invoke(TransactionalSecurityInterceptor.java:96) ~[core-api-1.0.13579.jar:13579] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) ~[spring-aop-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at com.fp.investing.service.transaction.FinancialTransactionService$$EnhancerBySpringCGLIB$$9a68dac2.getTransactionsForEmployeeUse(<generated>) ~[spring-core-4.2.0.RELEASE.jar:13579] 
    at com.fp.core.ws.financial.FinancialTransactionsController.getTransactionsForInternalUse(FinancialTransactionsController.java:78) ~[core-ws-1.0.13579.jar:13579] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_65] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_65] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_65] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_65] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111) ~[spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806) ~[spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729) ~[spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) [servlet-api.jar:?] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:?] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.30] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.30] 
    at com.fp.core.ws.http.CORSFilter.doFilterInternal(CORSFilter.java:39) [core-ws-1.0.13579.jar:13579] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.30] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.30] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.30] 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.30] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) [catalina.jar:8.0.30] 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) [tomcat-coyote.jar:8.0.30] 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) [tomcat-coyote.jar:8.0.30] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) [tomcat-coyote.jar:8.0.30] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) [tomcat-coyote.jar:8.0.30] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_65] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_65] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.30] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_65] 
+0

請至少標記(f.e.使用評論)FinancialTransactionService中的第223行(來自堆棧跟蹤)... – Betlista

+0

@Betlista完成。忘了提到這一點。 – John

+0

可能的重複[什麼是空指針異常,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do -i-fix-it) – dimo414

回答

1

讓我們來看看路223:

if (!Boolean.TRUE.equals(businessPartnership.getEscrowProvider())) { 

我們知道Boolean.TRUE不能是null,因爲它是true。我們也知道Boolean.equals()將返回false如果通過null,而不是提高NullPointerException,所以如果businessPartnership.getEscrowProvider()返回null並不重要。唯一剩下的原因是businessPartnership。您不能撥打null上的方法,如果您嘗試這樣做,您將導致NullPointerException。從JLS

調用一個實例方法的方法調用表達式(§15.12)拋出一個NullPointerException如果目標基準是null

規範What is a NullPointerException, and how do I fix it?涵蓋了這個更詳細的內容,但實際上你在這行之前缺少一些必要的理智檢查。在第223行,假設businessPartnership不能是null,但在某些情況下businessPartnershipService.getPartnership()返回null。要麼確保businessPartnershipService.getPartnership()從不返回null,要麼在調用businessPartnership.getEscrowProvider()之前添加空值檢查。

+0

謝謝。我已經評論了那部分代碼並試圖現在進行測試。 – John

+0

經過測試,我沒有得到例外。再次感謝您指出。 – John

+0

你明白你爲什麼首先得到例外嗎?你不能在'null'上調用方法。 – dimo414