2015-03-02 38 views
0

因此,我將JPA/Hibernate數據訪問層添加到我的項目中,該項目的webapp和數據部分在不同的war/jar中分開。儘管如此,webapp確實將數據jar包含爲Maven中的依賴項。在JUnit的數據端一切正常,部署給我沒有錯誤,但是當頁面加載並且對自動裝配的DAO bean的調用正在執行時,我得到一個NullPointerException。@Autowired上的webapp中的空指針

踢球者是,我沒有設計webapp部分,但我確實有控制權來修改它以根據需要進行這項工作。我有一種感覺,這與webapp仍然沒有看到自動裝配的DAO我試圖實例化甚至認爲數據jar被添加爲依賴項。

是否需要將某些內容添加到webapps applicationContext中以同步這些內容?我很新,所以我確信我錯過了一些非常明顯的東西!我看過類似的問題,但似乎沒有任何結果符合我目前的情況。

我的數據的ApplicationContext

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
     xmlns:lang="http://www.springframework.org/schema/lang" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
          http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
          http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd 
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
          http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <context:annotation-config/> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:persistence.xml" /> 
     <property name="persistenceUnitName" value="ApplicationEntityManager" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="url" value="***" /> 
     <property name="username" value="***" /> 
     <property name="password" value="***" /> 
    </bean> 

    <context:component-scan base-package="...data.dao"/> 
    <context:component-scan base-package="...data.service"/> 

</beans> 

他們的web應用「的applicationContext(分派小服務程序)

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="...web.controllers" /> 

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <property name="basename" value="messages"/> 
    </bean> 

    <bean name="/mypractice/*" class="...web.controllers.MyPracticeController">  
    </bean> 

    <bean name="/milestones/*" class="...web.controllers.MilestonesController"> 
    </bean> 

    <bean name="/resources/*" class="...web.controllers.ResourcesController"> 
    </bean> 

    <bean name="/file/*" class="...web.controllers.FilesController"> 
    </bean>  

    <bean id="uploader" class="...web.service.FileUploadRestService"> 
    </bean> 

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> 

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">  
    </bean> 

    <bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer" id="tilesConfigurer"> 
    <property name="definitions"> 
     <list> 
     <value>/WEB-INF/tiles.xml</value> 
     </list> 
    </property> 
    </bean> 

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" /> 

    <mvc:annotation-driven /> 

</beans> 

他們的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 


    <display-name>Webapp</display-name> 

    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
</web-app> 

堆棧跟蹤

[3/2/15 13:47:50:981 EST] 0000006e SystemOut  O In myPractice Controller 
[3/2/15 13:47:50:982 EST] 0000006e SystemOut  O About to call findPracticeByPracticeId... 
[3/2/15 13:47:51:004 EST] 0000006e SystemOut  O in my practice controller [[]] 
[3/2/15 13:47:50:982 EST] 0000006e SystemErr  R java.lang.NullPointerException 
[3/2/15 13:47:50:984 EST] 0000006e SystemErr  R at ....web.service.MyPracticeService.retrievPracticeDetails(MyPracticeService.java:51) 
[3/2/15 13:47:50:984 EST] 0000006e SystemErr  R at ....web.controllers.MyPracticeController.practicesList(MyPracticeController.java:42) 
[3/2/15 13:47:50:985 EST] 0000006e SystemErr  R at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[3/2/15 13:47:50:986 EST] 0000006e SystemErr  R at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 
[3/2/15 13:47:50:987 EST] 0000006e SystemErr  R at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
[3/2/15 13:47:50:987 EST] 0000006e SystemErr  R at java.lang.reflect.Method.invoke(Method.java:611) 
[3/2/15 13:47:50:988 EST] 0000006e SystemErr  R at org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:471) 
[3/2/15 13:47:50:989 EST] 0000006e SystemErr  R at org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:408) 
[3/2/15 13:47:50:989 EST] 0000006e SystemErr  R at ....web.common.BaseController.handleRequest(BaseController.java:32) 
[3/2/15 13:47:50:990 EST] 0000006e SystemErr  R at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
[3/2/15 13:47:50:990 EST] 0000006e SystemErr  R at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
[3/2/15 13:47:50:990 EST] 0000006e SystemErr  R at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
[3/2/15 13:47:50:991 EST] 0000006e SystemErr  R at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920) 
[3/2/15 13:47:50:992 EST] 0000006e SystemErr  R at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:816) 
[3/2/15 13:47:50:992 EST] 0000006e SystemErr  R at javax.servlet.http.HttpServlet.service(HttpServlet.java:575) 
[3/2/15 13:47:50:993 EST] 0000006e SystemErr  R at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801) 
[3/2/15 13:47:50:994 EST] 0000006e SystemErr  R at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
[3/2/15 13:47:50:994 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230) 
[3/2/15 13:47:50:995 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779) 
[3/2/15 13:47:50:995 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478) 
[3/2/15 13:47:50:996 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178) 
[3/2/15 13:47:50:996 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1071) 
[3/2/15 13:47:50:997 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87) 
[3/2/15 13:47:50:997 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:914) 
[3/2/15 13:47:50:998 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662) 
[3/2/15 13:47:50:998 EST] 0000006e SystemErr  R at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200) 
[3/2/15 13:47:50:999 EST] 0000006e SystemErr  R at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459) 
[3/2/15 13:47:50:999 EST] 0000006e SystemErr  R at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526) 
[3/2/15 13:47:51:000 EST] 0000006e SystemErr  R at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312) 
[3/2/15 13:47:51:000 EST] 0000006e SystemErr  R at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:88) 
[3/2/15 13:47:51:001 EST] 0000006e SystemErr  R at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175) 
[3/2/15 13:47:51:001 EST] 0000006e SystemErr  R at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
[3/2/15 13:47:51:002 EST] 0000006e SystemErr  R at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
[3/2/15 13:47:51:002 EST] 0000006e SystemErr  R at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 
[3/2/15 13:47:51:002 EST] 0000006e SystemErr  R at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 
[3/2/15 13:47:51:003 EST] 0000006e SystemErr  R at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) 
[3/2/15 13:47:51:003 EST] 0000006e SystemErr  R at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 
[3/2/15 13:47:51:004 EST] 0000006e SystemErr  R at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1864) 
+0

能否請您發表您的錯誤的完整堆棧跟蹤 – LynAs 2015-03-02 18:04:54

+0

堆棧跟蹤添加 – 2015-03-02 18:52:07

回答

0

應用程序啓動時沒有錯誤,這意味着沒有依賴性的問題。當控制器調用調用autowire變量時,問題在於如何創建該變量。檢查構造函數並檢查變量autowired類是否被註釋。 e.g

@Component 
public class className{} 

@Service 
public class className{} 
+0

我做了一個很好的一些改變,以我的應用程序。一些註釋已關閉,我相信它們現在應該是這樣。 JUnit測試仍然可以正常工作,但現在它自動裝配bean本身的錯誤,所以我想知道我錯過了什麼。讓我攤開來給你它目前設置方式: – 2015-03-02 23:08:15

+0

複製 - 編輯來 – 2015-03-02 23:08:15

+0

好了,所以我有: 數據區的jar: 實體(@Component) DAO(@Component) DAO接口(沒有說明) ServicetoDAO(@Component,@Service和Autowires的DAO接口) ServicetoDAO接口(@Transactional) 應用區戰:(包括數據區的jar) ControllerClass(@Controller&autowires的ServicetoDAO接口) – 2015-03-02 23:13:26