Tengo un proyecto basado en Spring MVC, Spring-Security y MyBatis. Usando autenticación personalizada para poder hacer algunas cosas adicionales cree una clase que implementa la interfaz UserDetailsService de Security. Todo me funciona bien si hago ahí la autenticación de manera manual, es decir, si forzo a que el usuario y passw devuelto sea válido todo funciona bien. Así que la clase está bien estructurada, sin embargo si trato de usar un mapper de MyBatis para traer los datos de una BD parece que no se instancia la clase a pesar de que Spring si inyecta la misma al momento de crear el bean.
El código:
Código:
public class HermesUserService implements UserDetailsService {
@Autowired
private UsersMapper maper;
@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
// Auto-generated method stub
Users user= null;
// Se trata de obtener el usuario desde la BD, si no existe se lanza exepción
try{
System.out.println(maper.toString()); // Aquí se produce una exepción porque maper no ha sido instanciado
}
catch (Exception e){
e.printStackTrace();
throw e;
}
System.out.println("usuario:" + userName);
try{
user = maper.selectByPrimaryKey(userName);
}
catch (Exception e){
e.printStackTrace();
}
if(user==null){
System.out.println("No econtrado");
throw new UsernameNotFoundException("Usuario/Password incorrecto");
}
System.out.println("SISS Pasoooooo");
//Si existe, se obtienen los privilegios del usuario
//TODO Obtener los privilegios desde la BD
Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("SADMIN");
return new User(user.getUsername(), user.getPassword(),authorities);
}
Si utilizo el mismo maper, en un controlador, ahí si se instancía correctamente. Sospecho que es alguna cosa de Spring porque UsersMapper es solo una Interface, MyBatis se encarga de implementarla y devolver una clase funcional, pero por algún motivo aquí no lo hace.