Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Checar email duplicado

Estou tentando validar se um e-mail existe no banco antes de cadastrá-lo, mas estou tendo dificuldade. Já tentei de algumas formas, mas todas sem resultado. Gostaria de algumas dicas. Seguem aqui as classes:

package br.com.casadocodigo.loja.validation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

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

public class UsuarioValidation implements Validator {

    @Autowired
    private UsuarioDAO dao;

    @Override
    public boolean supports(Class<?> clazz) {
        return Usuario.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "nome", "field.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "field.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "senha", "field.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "senhaConfirma", "field.required");

        Usuario usuario = (Usuario) target;

        if (!(usuario.getSenha().equals(usuario.getSenhaConfirma()))) {
            errors.rejectValue("senha", "notmatch.senha");
        }

        if (usuario.getSenha().length() < 5) {
            errors.rejectValue("senha", "shortpassword.senha");
        }

        boolean existe = dao.loadUserByUsername(usuario.getEmail()) != null;

        if (existe) {
            errors.rejectValue("email", "emailusado.email");
        }

    }

}
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 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 void gravar(Usuario usuario) {
        manager.persist(usuario);
    }

    public List<Usuario> listar() {
        return manager.createQuery("select distinct(u) from Usuario u", Usuario.class).getResultList();
    }

}
1 resposta
solução!

Bom, dei uma repassada no conteúdo do curso e cheguei a uma solução bem simples, apenas tratei a exceção com o @ExceptionHandler:

package br.com.casadocodigo.loja.controllers;

import java.util.List;

import javax.validation.Valid;

import org.hibernate.exception.ConstraintViolationException;
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.ExceptionHandler;
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 org.springframework.web.servlet.mvc.support.RedirectAttributes;

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

@Transactional
@Controller
@RequestMapping("/usuarios")
public class UsuarioController {

    @Autowired
    private UsuarioDAO dao;

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

    @RequestMapping("/form")
    public ModelAndView form(Usuario usuario) {
        return new ModelAndView("usuarios/usuariosForm");
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView listarUsuarios() {
        List<Usuario> usuarios = dao.listar();
        ModelAndView modelAndView = new ModelAndView("usuarios/usuariosLista");
        modelAndView.addObject("usuarios", usuarios);
        return modelAndView;
    }

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

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

            dao.gravar(usuario);

        redirectAttributes.addFlashAttribute("sucesso", "Usuário cadastrado com sucesso!");
        return new ModelAndView("redirect:/usuarios");
    }

    @ExceptionHandler(ConstraintViolationException.class)
    public ModelAndView usuarioExiste(RedirectAttributes redirectAttributes){
        redirectAttributes.addFlashAttribute("mail", "Usuário já existe!");
        return new ModelAndView("redirect:/usuarios/form");
    }
}