Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Validar livro existente no banco

Olá, Estou com uma dúvida em relação a validação. Consegui implementar as validações sugeridas no exercício. Minha dúvida é a seguinte, como faço para conferir se o livro a ser cadastrado, já foi anteriormente inserido no banco. E se já foi, proibir o novo cadastro. Estou pegando dicas deste curso mas estou tentando fazer um CRUD de Usuário. Portanto, no meu exemplo, quero verificar se o login já está no banco e, se estiver, recusar o novo cadastro. No meu exemplo, eu coloquei esta verificação na camada do controller e funcionou, mas gostaria de inserir na classe criada para validação e não estou tendo sucesso.

Classes:

UserDAO

@Repository
@Transactional
public class UserDAO {

    @PersistenceContext
    private EntityManager manager;

    public void save(User user) {
        user.setCreatedDate(Calendar.getInstance());
        manager.persist(user);
    }

    public List<User> list() {
        return manager.createQuery("select p from User p").getResultList();
    }

    public List<User> findWithLogin(String login) {
        return manager.createQuery("select p from User p WHERE p.login LIKE :custLogin")
            .setParameter("custLogin", login).getResultList();
    }
}

UserValidation

public class UserValidation implements Validator {

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

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "login", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "password", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "name", "field.required");
        User user = (User) target;
        if (user.getPassword() != null
              && user.getPassword().trim().length() < 4) {
           errors.rejectValue("password", "field.min.length");
        }
    }

}

UserController

@Controller
@RequestMapping("users")
public class UserController {

    @Autowired
    private UserDAO userDao;

    @RequestMapping("new-user")
    public ModelAndView form() {
        return new ModelAndView("users/form");
    }

    @RequestMapping("add-user")
    public ModelAndView save(@Valid User user, BindingResult result, RedirectAttributes redirectAttributes) {
        if(result.hasErrors()){
            return form();
        }
        List<User> findList = userDao.findWithLogin(user.getLogin());
        if(!findList.isEmpty()){
            redirectAttributes.addFlashAttribute("usuarioexistente", "Este login já foi cadastrado anteriormente!");
            return new ModelAndView("redirect:new-user");
        }
        userDao.save(user);
        redirectAttributes.addFlashAttribute("sucesso", "Usuário Cadastrado com Sucesso!");
        return new ModelAndView("redirect:list-users");
    }

    @RequestMapping({"/", "list-users"})
    public ModelAndView list(){
        List<User> users = userDao.list();
        ModelAndView modelAndView = new ModelAndView("/users/lista");
        modelAndView.addObject("users", users);
        return modelAndView;
    }

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

}

form.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ERP - Usuário</title>
</head>
<body>
<h2>${usuarioexistente}</h2>
<form action="add-user" method="post">
  <fieldset>
    <legend>Cadastrando um novo usuário:</legend>
    Login:<br>
    <input type="text" name="login">
    <form:errors path="user.login" /><br>
    Senha:<br>
    <input type="text" name="password">
    <form:errors path="user.password" /><br>
    Nome:<br>
    <input type="text" name="name">
    <form:errors path="user.name" /><br>
    <input type="submit" value="Cadastrar">
  </fieldset>
</form>
</body>
</html>
2 respostas
solução!

Como é uma validação de negócio, vc pode criar uma classe para ela, só para isolar e chamar ela do seu controller. Para mim não tem problema nenhum.. o resto do código está ok.

Alberto, minha preocupação é apenas encapsulamento mesmo. Não conseguia ver ela como uma validação diferente das validações de characteres, mas vou fazer isso. Obrigado.