1
resposta

Não estou conseguindo comparar e-mail cadastrado com formulário

Bom dia. Minha dificuldade está em comparar se o e-mail digitado no formulário já existe no banco de dados.

Vou postar as classes relativas

Classe UsuarioValidation

package br.com.casadocodigo.loja.validation;

//imports

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.rejectIfEmpty(errors, "nome", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "email", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "senha", "field.required");

        Usuario usuario = (Usuario) target;
        String senha = usuario.getSenha();
        String senha2 = usuario.getSenha2();

        String email = usuario.getUsername();

        if (dao.emailExiste(email)) {
            System.out.println("E-mail já existe");
        } else if (!senha.equals(senha2) && !senha.isEmpty()) {
            errors.rejectValue("senha", "field.required.usuario.senha.confere");
        } else if (senha.length() <= 4 && !senha.isEmpty()) {
            errors.rejectValue("senha", "typeMismatch.usuario.senha");
        }

    }

}

Classe UsuarioDAO

package br.com.casadocodigo.loja.dao;

//imports

@Repository
@Transactional
public class UsuarioDAO implements UserDetailsService {

    @PersistenceContext
    private EntityManager manager;

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

        if (!usuarios.isEmpty()) {
            return true;
        } else
            return false;
    }

E a UsuarioController

package br.com.casadocodigo.loja.controllers;

//imports

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

    @Autowired
    private UsuarioDAO dao;

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

@RequestMapping(value = "/form", method = RequestMethod.POST)
@Transactional
    public ModelAndView grava(@Valid Usuario usuario, BindingResult result, RedirectAttributes redirectAttributes) {

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

        dao.gravar(usuario);

        redirectAttributes.addFlashAttribute("message", "Usuário " + usuario.getNome() + " cadastrado com sucesso!");

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

Da forma que está agora está dando NullPointerException

java.lang.NullPointerException
    at br.com.casadocodigo.loja.validation.UsuarioValidation.validate(UsuarioValidation.java:36)
    at org.springframework.validation.DataBinder.validate(DataBinder.java:895)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.validateIfApplicable(ModelAttributeMethodProcessor.java:166)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:113)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
    ...

Retirando o método emailExiste() volta a funcionar normalmente (sem a verificação de e-mail obviamente).

1 resposta

O objeto que você está chamando esse método está nulo, é o equivalente a fazer null.emailExiste(), debuga para ver se esse objeto realmente não está sendo preenchido