UserDetailsS​​ervice实现的类不是注入自动装配的字段

时间:2014-03-04 06:48:40

标签: java spring spring-annotations

我正在使用acegi身份验证进行登录。当我尝试比较数据库的值 我正在使用以下课程

 @Transactional(readOnly = true)
    @Service
    public class CustomUserDetailsService implements UserDetailsService {
        @Autowired
        private UserDAO userdao;
    public UserDetails loadUserByUsername(String username)
                throws UsernameNotFoundException, DataAccessException {
com.quest.model.dto.User dbUser = userdao.searchDatabase(username);
    }
    }

但是自动连接字段未初始化。 但它在控制器类中初始化。 该类通过spring-security XML

进行映射
<

    ?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:security="http://www.springframework.org/schema/security"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/security 
                http://www.springframework.org/schema/security/spring-security.xsd
                http://www.springframework.org/schema/mvc 
                http://www.springframework.org/schema/mvc/spring-mvc.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

        <!-- This is where we configure Spring-Security  -->
        <!-- <context:annotation-config />
        <context:component-scan base-package="com.quest" /> 
        <mvc:annotation-driven /> --> 
        <security:http auto-config="true" use-expressions="true" access-denied-page="/auth/denied" >

            <security:intercept-url pattern="/auth/home" access="permitAll"/>
            <security:intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')"/>
            <security:intercept-url pattern="/student/*" access="hasRole('ROLE_STUDENT')"/>
            <security:intercept-url pattern="/control/*" access="hasRole('ROLE_TEACHER')"/>

            <!-- <security:form-login
                    login-page="/auth/home" 
                    authentication-failure-url="/auth/home?error=true" 
                    default-target-url="/control/dummyLogin"/> -->
            <security:form-login
                    login-page="/auth/home" 
                    authentication-failure-url="/auth/home?error=true" 
                    default-target-url="/student/student"/>

            <security:logout 
                    invalidate-session="true" 
                    logout-success-url="/auth/home" 
                    logout-url="/student/logout"/>

        </security:http>

        <!-- Declare an authentication-manager to use a custom userDetailsService -->
        <security:authentication-manager>
                <security:authentication-provider user-service-ref="customUserDetailsService">
                        <security:password-encoder ref="passwordEncoder"/>
                </security:authentication-provider>
        </security:authentication-manager>

        <!-- Use a Md5 encoder since the user's passwords are stored as Md5 in the database -->
        <bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" id="passwordEncoder"/>

        <!-- A custom service where Spring will retrieve users and their corresponding access levels  -->
        <bean id="customUserDetailsService" class="com.quest.service.CustomUserDetailsService"/>


    </beans>

这是spring-servlrt.xml

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
    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"
    xmlns:ws="http://jax-ws.dev.java.net/spring/core"   
    xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.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
        http://jax-ws.dev.java.net/spring/core http://jax-ws.java.net/spring/core.xsd
        http://jax-ws.dev.java.net/spring/servlet http://jax-ws.java.net/spring/servlet.xsd">


    <context:annotation-config />
    <context:component-scan base-package="com.quest.*" />   
    <mvc:annotation-driven /> 
    <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
      <property name="baseAddress" value="http://localhost:9999/"/>
    </bean>

    <bean id="jspViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
    <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="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan">
            <list>
                <value>com.quest.model.dto</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.configurationClass">org.hibernate.cfg.AnnotationConfiguration</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="sessionFactory">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

<!--    <bean id="jacksonMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> !-->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter" />
            </list>
        </property>
    </bean>


     <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="com.quest.data.converter.HibernateAwareObjectMapper" />
                </property>
            </bean>

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="200000" />
    </bean>

    <bean id="seedDataInstaller" 
        class="com.quest.model.SeedData"  init-method="populateSeed">
    </bean>

</beans>

,userDAO看起来像

package com.quest.model.dao; @Repository("userdao") public class UserDAO { ...}

2 个答案:

答案 0 :(得分:0)

没有定义名为'userdao'的bean

您必须将xml配置中的UserDao定义为bean或使用@component

注释UserDao类

如果您正在关注基于注释的配置,请取消注释config xml

中的以下部分
<!-- 
<context:annotation-config />
<context:component-scan base-package="com.quest.*>" /> 
<mvc:annotation-driven /> 
--> 

答案 1 :(得分:0)

Your web.xml is creating two Spring application contexts. Let's call them Security (after spring-security.xml) and Servlet (after spring-servlet.xml). Security is created by the ContextLoaderListener listener, and Servlet is created by the DispatcherServlet servlet. Security is the parent of Servlet. That means that the beans in Security are only visible to other beans in Security, and the beans in Servlet can see both the beans in Security and in Servlet.

You're defining the CustomUserDetailsService (CUDS) bean in Security, and the UserAccountDao and UserDao beans in Servlet, so the CUDS bean can't see them.