0

私はSpring MVC + Spring Security + hibernateの例に取り組んでログインページを作成しましたが、@Autowirenull値を与え続ける燃料の問題に直面しました。サーバーは、操作を完了していないというエラーを報告しません。

CustomUSerDetailsS​​ervice.java

package com.carloscortina.paidosSimple.service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

import com.carloscortina.paidosSimple.dao.UsuarioDao;
import com.carloscortina.paidosSimple.model.Usuario;

@Service
@Transactional(readOnly=true)
public class CustomUserDetailsService implements UserDetailsService {

    private static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class);

    @Autowired UsuarioDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {

        logger.info(username);
        Usuario domainUser = userDao.getUsuario(username);
        logger.info(domainUser.getUsername());

        boolean enabled = true;
        boolean accountNonExpired = true;
        boolean credentialsNonExpired = true;
        boolean accountNonLocked = true;

        return new User(
            domainUser.getUsername(),
            domainUser.getPassword(),
            enabled,
            accountNonExpired,
            credentialsNonExpired,
            accountNonLocked,
            getAuthorities(domainUser.getRol().getId()));
    }

    public Collection<? extends GrantedAuthority> getAuthorities(Integer rol){
        List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(rol));
        return authList;
    }

    public List<String> getRoles(Integer rol){
        List<String> roles = new ArrayList<String>();

        if(rol.intValue() == 1){
            roles.add("ROLE_DOCTOR");
            roles.add("ROLE_ASISTENTE");
        }else if (rol.intValue() == 2){
            roles.add("ROLE_ASISTENTE");
        }
        return roles;
    }

    public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles){
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();

        for (String role : roles) {
            authorities.add(new SimpleGrantedAuthority(role));
        }
        return authorities;

    }

}

ここでは、フィールドuserDaoが null のままであるためuserDao.getUsuario(username)、操作を使用しようとすると続行されず、エラーなどは報告されず、404 エラーが表示されるだけです

UsuarioDao.xml

package com.carloscortina.paidosSimple.dao;

import java.util.ArrayList;
import java.util.List;


import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.carloscortina.paidosSimple.model.Usuario;

@Repository
public class UsuarioDaoImp implements UsuarioDao {

    private static final Logger logger = LoggerFactory.getLogger(UsuarioDaoImp.class);

    @Autowired
    private SessionFactory sessionFactory;

    private Session getCurrentSession(){
        return sessionFactory.getCurrentSession();
    }

    @Override
    public Usuario getUsuario(String username) {
        logger.debug("probando");
        List<Usuario> userList = new ArrayList<Usuario>();
        Query query = getCurrentSession().createQuery("from Usuario u where u.Username = :username");
        query.setParameter("username", username);
        userList = query.list();
        if (userList.size() > 0){
            return (Usuario) userList.get(0);
        }else{
            return null;
        }
    }

}

サーブレット-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.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/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Enable transaction Manager -->
    <tx:annotation-driven/>

    <!-- DataSource JNDI -->
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/paidos" resource-ref="true" />

    <!--  Session factory -->
    <beans:bean id="sessionFactory" 
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
        p:dataSource-ref="dataSource"
        p:hibernateProperties-ref="hibernateProperties"
        p:packagesToScan="com.carloscortina.paidosSimple.model" />

    <!--  Hibernate Properties -->
    <util:properties id="hibernateProperties">
        <beans:prop key="hibernate.dialect">
            org.hibernate.dialect.MySQL5InnoDBDialect
        </beans:prop>
        <beans:prop key="hibernate.show_sql">false</beans:prop>
    </util:properties>

    <beans:bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager"
        p:sessionFactory-ref="sessionFactory" />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:component-scan base-package="com.carloscortina.paidosSimple" />

</beans:beans>

何が足りないのかわからないので、どんなアイデアでも大歓迎です。よろしくお願いします。

編集:ウスアリオダオインプ

package com.carloscortina.paidosSimple.dao;

import java.util.ArrayList;
import java.util.List;


import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.carloscortina.paidosSimple.model.Usuario;

@Repository
public class UsuarioDaoImp implements UsuarioDao {

    private static final Logger logger = LoggerFactory.getLogger(UsuarioDaoImp.class);

    @Autowired
    private SessionFactory sessionFactory;

    private Session getCurrentSession(){
        return sessionFactory.getCurrentSession();
    }

    @Override
    public Usuario getUsuario(String username) {
        logger.debug("probando");
        List<Usuario> userList = new ArrayList<Usuario>();
        Query query = getCurrentSession().createQuery("from Usuario u where u.Username = :username");
        query.setParameter("username", username);
        userList = query.list();
        if (userList.size() > 0){
            return (Usuario) userList.get(0);
        }else{
            return null;
        }
    }

}

UsuarioDaoImp で Bean を追加しようとした後、次のエラーが発生しました。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usuarioServicioImp': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.carloscortina.paidosSimple.dao.UsuarioDao com.carloscortina.paidosSimple.service.UsuarioServicioImp.usuarioDao; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.carloscortina.paidosSimple.dao.UsuarioDao] is defined: expected single matching bean but found 2: usuarioDaoImp,userDao

UsuarioServiceImp

package com.carloscortina.paidosSimple.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.carloscortina.paidosSimple.dao.UsuarioDao;
import com.carloscortina.paidosSimple.model.Usuario;

@Service
@Transactional
public class UsuarioServicioImp implements UsuarioService{

    @Autowired
    private UsuarioDao usuarioDao;

    @Override
    public Usuario getUsuario(String username) {
        return usuarioDao.getUsuario(username);
    }

}

私は主題についての知識が不足していると思います。なぜ私は例に従っていたのですが、これで終わったので、情報を正しく提供していない場合や概念を誤解している場合はお詫び申し上げます。

spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:security="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.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/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">


    <beans:bean class="com.carloscortina.paidosSimple.service.CustomUserDetailsService" id="customUserDetailsService"></beans:bean>

    <security:http auto-config="true">
        <security:intercept-url pattern="/sec/moderation.html" access="ROLE_ASISTENTE" />  
        <security:intercept-url pattern="/admin/*" access="ROLE_DOCTOR" />   
        <security:form-login login-page="/user-login.html" 
            default-target-url="/success-login.html" 
            authentication-failure-url="/error-login.html" />  
        <security:logout logout-success-url="/index.html" />
    </security:http>  

    <security:authentication-manager>  
        <security:authentication-provider user-service-ref="customUserDetailsService">  
            <security:password-encoder hash="plaintext" />
        </security:authentication-provider>  
    </security:authentication-manager>  

</beans:beans>  
4

2 に答える 2