Iniciei um pequeno projeto spring-boot, porem resolvi usar JdbcTemplate ao inves de JPA pois é em um banco de terceiros. Porem percebi que as validacoes nao vem quando eu inicio o projeto spring boot com jdbc, mas se eu colocar o jpa funciona normalmente.
Desconheço uma implementação do beans validation para JDBC, pois funciona com JPA pois é o hibernate que provê uma implementação da especificação para ser usada.
Foi só um exemplo para aplicação web, que é o mais comum hoje. Mas a validação pode funcionar em qualquer situação dentro do Java. Um exemplo sem depender do tipo de aplicação:
Teste teste = new Teste();
teste.setNome("");
Set<ConstraintViolation<Teste>> constraintViolation = validator.validate(teste);
if (!constraintViolation.isEmpty()) {
throw new ConstraintViolationException(constraintViolation);
}
Isso pode ficar no ServiceBase. Não precisa amarrar a um mecanismo de persistência ou trazer overhead do JPA. Tem muitas formas de usar o Bean Validation, é o que pude exemplificar, mas dá uma pesquisada geral sobre Spring com Bean Validation.
Com o último exemplo que passei é só explorar o constraintViolation que nao terá mistérios, sem overhead de JPA/Hibernate pode validar qualquer POJO no Service ou onde desejar.
Ta tudo certinho aqui. Pior que acho que ja passei por isso antes, e nao sei o que foi. Mas é verdade que o BeanValidation é para funcionar independente de persistencia, pois ele é chamado na hora que recebo os dados no controller e so depois da validacao que o fluxo continua.
public class Secao {
private Long id;
@Size(min = 3, max = 30, message = "O campo NOME deve ter entre 3 e 30 caracteres.")
@NotEmpty(message = "O campo NOME deve ser preenchido.")
private String nome;
public Secao() {
}
public Secao(Long id) {
super();
this.id = id;
}
public Secao(Long id, String nome) {
super();
this.id = id;
this.nome = nome;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome.toUpperCase();
}
public boolean isNovo() {
return id == null;
}
}
@Controller
@RequestMapping("/secoes")
public class SecaoController {
@Autowired
SecaoService secaoService;
@GetMapping
public ModelAndView listar() {
ModelAndView mv = new ModelAndView("secao/PesquisaSecao");
mv.addObject("secoes", secaoService.findAll());
return mv;
}
@GetMapping("/cadastrar")
public ModelAndView cadastrar(Secao secao) {
return new ModelAndView("secao/CadastroSecao");
}
@RequestMapping(value = { "/cadastrar", "{\\d+}" }, method = RequestMethod.POST)
public ModelAndView salvar(@Valid Secao secao, BindingResult result, RedirectAttributes attributes) {
if (result.hasErrors()) {
cadastrar(secao);
}
secaoService.saveOrUpdate(secao);
attributes.addFlashAttribute("mensagem", "Seção cadastrada com sucesso!");
return new ModelAndView("redirect:/secoes");
}
@GetMapping("/{id}")
public ModelAndView editar(@PathVariable("id") Long id) {
Secao secao = secaoService.findById(id);
ModelAndView mv = cadastrar(secao);
mv.addObject(secao);
return mv;
}
@DeleteMapping("/{id}")
public @ResponseBody ResponseEntity<?> excluir(@PathVariable("id") Long id) {
secaoService.delete(id);
return ResponseEntity.ok().build();
}
}
eu sei usar validacao, ja uso faz anos. A questao foi so pq eu criei um projeto e ela nao entrou, quando coloquei recurso, simplesmente nao funcionou e por incrivel que pareca acabei de criar um projeto novo, e da mesma forma que o anterior com as mesmas versoes e pacotes e funcionou. O que é mais estranho.