Правильное внедрение SessionFactory с помощью Spring и Spring Security - PullRequest
0 голосов
/ 13 марта 2011

У меня есть это исключение

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 с помощью Hibernate

и получил сообщение об ошибке «Не указан бин ... определен». Поэтому я переместил бины из dispatcher-servlet.xml в applicationContext-common-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>

Бины в despatcher-servlet.xml загружаются с помощью компонентного сканирования и автоматически и правильно вводят sessionFactory. Но бобов в 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>

UserDetailsService внедряется через конструктор, но как внедрить sessionFactory в userDAO? SessionFactory определен в ADiHibernateGenericDAO, и все DAO расширяют абстрактный ADiHibernateGenericDAO. Исключение выше генерируется в SessionFactory, который не внедряется.

Спасибо за любой ответ.

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Mate, я не вижу менеджера транзакций или

записано в любом месте вашего файла конфигурации бина. Вы должны положить его туда, если вы уже этого не сделали. Это может быть проблемой.

1 голос
/ 13 марта 2011

Вы не показали нам свой класс DiUserDAO, но, предполагая, что в нем есть установщик для setSessionFactory(), вы можете просто изменить свое сопоставление XML следующим образом:

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

В качестве альтернативы выможет изменить ваш класс DiUserDAO, чтобы пометить поле SessionFactory как @Autowired.

То же решение применяется к любым другим компонентам, которым необходим доступ к этому компоненту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...