2013-08-05 5 views
0

Я работал над примером весеннего MVC + Spring Security + hibernate, чтобы сделать страницу входа в систему, но теперь я столкнулся с проблемой с топливом @Autowire, который продолжает давать мне нулевые значения. сервер не сообщает о каких-либо ошибках, только что он не завершил операцию.Autowired Field Null

CustomUSerDetailsService.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 сохраняет beign нуль так, когда я пытаюсь использовать 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> 

Я не знаю, что пропало без вести, поэтому любая идея его приветствует, спасибо заранее.

Edit: UsuarioDaoImp ​​

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 ​​я получил эту ошибку:

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); 
    } 

} 

я думаю, что я короткие знания о предмете, почему я следовал примеру, но я d с этим, поэтому приношу свои извинения, если я не даю информацию правильно или если я неправильно понимаю понятия.

весна-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> 
+0

Где вы создали боб UsuarioDaoImp? –

+0

хорошо подумал, что это проволока весной, используя аннотацию @@ Repository на UsuarioDaoImp ​​ – Ccortina

ответ

3

Как вы обращающегося класс CustomUSerDetailsService? Надеюсь, вы не добавили этот класс в bean-файл в конфигурационный файл безопасности или в любой другой конфигуратор Spring?

Editted: Ваш боб служба помечается @service и вы также объявили его в XML, весной создал две службы фасоли один на основе @service аннотацию (полностью заселенной в качестве autowried) и второй с помощью XML config (в котором я предполагаю, что вы явно не ввели dao-зависимость), поэтому у второго нет набора dao-объектов. Поскольку вы используете имя компонента для служебного компонента, объявленного в вашей конфигурации безопасности, вы получаете userDao как null при отладке.

Либо комментировать явное определение bean-компонента в security xml, использовать ref = "customUSerDetailsService" непосредственно, поскольку аннотация @service уже добавила компонент с этим именем в весеннем контексте.

i.e комментарий/удалить эту строку в вашей конфигурации безопасности, и каждая вещь должна работать.

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

При аннотирования фасоли с пружиной @ компонент/@ службы добавляет боб с именем равно коротким именем класса (первая буква в нижнем регистре), так боб с именем «customUserDetailsService» уже существует, определив его в явном xml переопределяет его.

или объявить все определения боб (в том числе там зависимостей) явно это XML-конфигурации

+0

привет .. да я добавил bean-компонент в xml безопасности. – Ccortina

+0

, так что теперь есть два служебных компонента, один из которых автоматически настроен, но не используется, а другой в xml не заполняется userDao. попробуйте использовать имя сервисного компонента в ref без объявления сервисного компонента в xml – coder

+0

им жаль, но как это сделать? im все еще привыкает к терминам и понятиям с весной. – Ccortina

1

Добавьте пакет дао к компоненту сканирования

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

спасибо, но это не сработало .. значение userDao хранит beign null – Ccortina

+0

Выбрасывает ли какие-либо исключения .. вы можете показать ошибки? –

+0

thats также моя проблема, это не показывает никаких ошибок или исключений. Я просто знаю его значение null, потому что я использую debug Spring Tool Suite и добавляю breakline, и он говорит, что значение равно null. – Ccortina