3
respostas

Problema de Autowired no usuarioDao

Olá, estou com problemas ao utilizar a auto injeção do spring na minha classe usuarioDao, ao utilizar o método gravar do meu controller o objeto não estava sendo persistido no banco, debugando o código percebi que a instancia da classe usuarioDao estava com valor null, mesmo após pesquisar no fórum não consegui uma solução.

UsuarioController

package br.com.casadocodigo.loja.controllers;

import java.util.Arrays;
import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import br.com.casadocodigo.loja.dao.UsuarioDAO;
import br.com.casadocodigo.loja.models.Role;
import br.com.casadocodigo.loja.models.Usuario;
import br.com.casadocodigo.loja.validation.UsuariosValidation;

@Controller
@RequestMapping("/usuarios")
public class UsuarioControllers {

    @Autowired
    private UsuarioDAO usuarioDao;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(new UsuariosValidation());
    }

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView listar() {
        ModelAndView modelAndView = new ModelAndView("usuario/usuarios");
        List<Usuario> usuarios = usuarioDao.listar();
        modelAndView.addObject("usuarios", usuarios);

        return modelAndView;
    }

    @Transactional
    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView gravar(@Valid Usuario usuario, BindingResult result) {

        if(result.hasErrors()) {
            return form(usuario);
        }

        System.out.println(usuarioDao);
        usuarioDao.gravar(usuario);

        return new ModelAndView("redirect:usuarios");
    }

    @RequestMapping("/form")
    private ModelAndView form(Usuario usuario) {
        ModelAndView modelAndView = new ModelAndView("usuario/form");
        modelAndView.addObject("usuario", usuario);
        return modelAndView;
    }

    @Transactional
    @RequestMapping("/$2a$10$9MS5preza5MmPd8BGwy7WemDKh4X13qqs6g/o7/Kdf9v6LagVg6GG")
    private ModelAndView urlMagicaUsuario() {

        Usuario usuario = new Usuario();
        usuario.setNome("admin");
        usuario.setEmail("admin@email.com");
        usuario.setSenha("$2a$10$9MS5preza5MmPd8BGwy7WemDKh4X13qqs6g/o7/Kdf9v6LagVg6GG");//senha 12345
        usuario.setRoles(Arrays.asList(new Role("ROLE_ADMIN")));
        System.out.println(usuarioDao);
        usuarioDao.gravar(usuario);

        return new ModelAndView("login");
    }

}

o método utilizado é o "gravar"

UsuarioDao

package br.com.casadocodigo.loja.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Repository;

import br.com.casadocodigo.loja.models.Usuario;

@Repository
public class UsuarioDAO implements UserDetailsService{

    @PersistenceContext
    private EntityManager manager;

    public void gravar(Usuario usuario) {
        System.out.println(usuario);
        manager.persist(usuario);
    }

    public Usuario loadUserByUsername(String email) {
        List<Usuario> usuarios = manager.createQuery("select u from Usuario u where email = :email", Usuario.class)
                .setParameter("email", email)
                .getResultList();

        if(usuarios.isEmpty()) {
            throw new UsernameNotFoundException("Usuario " + email + " não foi encontrado");
        }

        return usuarios.get(0);
    }


    public List<Usuario> listar(){

        return manager.createQuery("select u from Usuario u", Usuario.class)
                .getResultList();
    }

}
3 respostas

Continuando...

Classe Usuario

package br.com.casadocodigo.loja.models;

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

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Transient;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

@Entity
public class Usuario implements UserDetails {

    private static final long serialVersionUID = 1L;

    @Id
    private String email;

    private String senha;

    private String nome;

    @Transient
    private String senhaRepetida; 

    @ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST)
    private List<Role> roles = new ArrayList<>();

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.roles;
    }

    @Override
    public String getPassword() {
        return this.senha;
    }

    @Override
    public String getUsername() {
        return this.email;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public String getSenhaRepetida() {
        return senhaRepetida;
    }

    public void setSenhaRepetida(String senhaRepetida) {
        this.senhaRepetida = senhaRepetida;
    }

    @Override
    public String toString() {
        return "[" + this.nome + "; " + this.email + "]";
    }

}

também tenho o código completo no Git https://github.com/rgweber/casadocodigo.git

Agradeço a quem puder ajudar

No usuarioDao.grava.. dá nullpointer ? Coloca um syso antes com o usuarioDao pra ver se está null

Usei o método urlMagica agora para realizar o teste mais rapidamente, mas sim está ocorrendo nullpointer. segue o erro

null Erro acontecendo! java.lang.NullPointerException at br.com.casadocodigo.loja.controllers.UsuarioControllers.urlMagicaUsuario(UsuarioControllers.java:77) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source)