2011-03-13 47 views
0

我有這樣的例外的SessionFactory的正確注射春春安全

java.lang.NullPointerException 
cz.xkadle21.dip.dao.ADiHibernateGenericDAO.findByCriteria(ADiHibernateGenericDAO.java:116) 
cz.xkadle21.dip.dao.impl.DiUserDAO.findUserByUsername(DiUserDAO.java:86) 
cz.xkadle21.dip.service.impl.DiUserContextSecurityService.loadUserByUsername(DiUserContextSecurityService.java:47) 
cz.xkadle21.dip.service.impl.DiUserContextSecurityService.loadUserByUsername(DiUserContextSecurityService.java:1) 

我下面這個教程Spring Security 3 database authentication with Hibernate

,並得到了「沒有名叫豆...定義」的錯誤。讓我感動的調度員servlet.xml中豆類的applicationContext-共business.xml和改變裝載在web.xml

的web.xml

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/applicationContext-common-business.xml 
     /WEB-INF/applicationContext-security.xml 
    </param-value> 
</context-param> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

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

豆在調度員-servlet.xml中與組件加載-scan,並正在自動注入sessionFactory。但是bean在applicationContext-common-business.xml中沒有。

的applicationContext-共business.xml

<bean name="userDetailsService" 
    class="cz.xkadle21.dip.service.impl.DiUserContextSecurityService" > 
    <constructor-arg ref="userDAO" /> 
    <constructor-arg ref="securityUserFactory" />  
</bean> 

<bean id="securityUserFactory" class="cz.xkadle21.dip.factory.impl.DiSecurityUserFactory" /> 
<bean id="userDAO" class="cz.xkadle21.dip.dao.impl.DiUserDAO" /> 



<bean id="propertyConfigurer" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
    p:location="/WEB-INF/jdbc.properties" /> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" p:driverClassName="${hibernate.connection.driver_class}" 
    p:url="${hibernate.connection.url}" p:username="${hibernate.connection.username}" 
    p:password="${hibernate.connection.password}" /> 


<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 


    <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> 
     </props> 
    </property> 
</bean> 

的UserDetailsS​​ervice通過構造函數注入,但如何注入SessionFactory來userDAO的? SessionFactory在ADiHibernateGenericDAO中定義,並且所有DAO擴展抽象ADiHibernateGenericDAO。上面的異常在SessionFactory上引發,而不是注入。

感謝您的回覆。

回答

1

伴侶,我沒有看到任何事務管理器或

< TX:註解驅動/>

在bean配置文件中的任意位置寫入。你應該把它放在那裏,如果你已經沒有。這可能是問題所在。

+0

嗨,我已經明白了。我認爲這個定義應該只在一個配置文件中。所以我把它放在兩邊,現在它正在工作。 – rizler 2011-03-14 19:23:57

+0

-servlet.xml – 2011-03-14 19:53:47

+0

中,當它只存在於 -servlet.xml中時,它比通過applicationContext-common-business加載的不在bean中工作的事務更好。 xml配置文件 – rizler 2011-03-14 23:00:13

1

你還沒有告訴我們您的DiUserDAO類,但假設你有setSessionFactory()中有一個二傳手,你可以簡單地改變你的XML映射到如:

<bean id="userDAO" class="cz.xkadle21.dip.dao.impl.DiUserDAO"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

另外,您可以修改您的DiUserDAO類將SessionFactory字段標記爲@Autowired

相同的解決方案適用於需要訪問此bean的任何其他bean。

+0

是的,你說得對。我之前嘗試直接注入抽象類。有了註釋,它不適合我。只有通過構造函數或setter(我在想,這些註釋只能在dispatcher-servlet.xml配置中工作。)現在我有「沒有Hibernate Session綁定到線程」,但也許這是以某種方式解決它自己。再次感謝您的回覆 – rizler 2011-03-13 15:27:29