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>