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.
J
javaflex1 like
Usa o “Bean Validation” do Spring Boot. Funciona com qualquer POJO, independente do que estiver usando para persistência.
packagecom.example.demo;importjavax.validation.constraints.NotEmpty;publicclassTeste{@NotEmpty(message="Nome é requerido")privateStringnome;publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}}
eu fiz isso. Aparece as anotações de validação, porém não valida nada.
L
Lucas_Camara1 like
Do jeito que o @javaflex passou, ele vai validar na camada REST, mas acho que não serve para jdbcTemplate.
T
thimor
exato, eu nao estou usando rest. ter que fazer na mao mesmo ou ativar a jpa e usar o jdbctemplate
J
javaflex1 like
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:
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.
T
thimor
eu agora ja estou achando que eh problema do projeto. pois criei um entity jpa aqui e nao ta validando tb.
J
javaflex2 likes
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.
J
javaflex1 like
Classe completa caso tenha dúvida sobre as referencias:
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.
publicclassSecao{privateLongid;@Size(min=3,max=30,message="O campo NOME deve ter entre 3 e 30 caracteres.")@NotEmpty(message="O campo NOME deve ser preenchido.")privateStringnome;publicSecao(){}publicSecao(Longid){super();this.id=id;}publicSecao(Longid,Stringnome){super();this.id=id;this.nome=nome;}publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome.toUpperCase();}publicbooleanisNovo(){returnid==null;}}
@Controller@RequestMapping("/secoes")publicclassSecaoController{@AutowiredSecaoServicesecaoService;@GetMappingpublicModelAndViewlistar(){ModelAndViewmv=newModelAndView("secao/PesquisaSecao");mv.addObject("secoes",secaoService.findAll());returnmv;}@GetMapping("/cadastrar")publicModelAndViewcadastrar(Secaosecao){returnnewModelAndView("secao/CadastroSecao");}@RequestMapping(value={"/cadastrar","{\\d+}"},method=RequestMethod.POST)publicModelAndViewsalvar(@ValidSecaosecao,BindingResultresult,RedirectAttributesattributes){if(result.hasErrors()){cadastrar(secao);}secaoService.saveOrUpdate(secao);attributes.addFlashAttribute("mensagem","Seção cadastrada com sucesso!");returnnewModelAndView("redirect:/secoes");}@GetMapping("/{id}")publicModelAndVieweditar(@PathVariable("id")Longid){Secaosecao=secaoService.findById(id);ModelAndViewmv=cadastrar(secao);mv.addObject(secao);returnmv;}@DeleteMapping("/{id}")public@ResponseBodyResponseEntity<?>excluir(@PathVariable("id")Longid){secaoService.delete(id);returnResponseEntity.ok().build();}}
<modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/><!-- lookup parent from repository --></parent><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>nz.net.ultraq.thymeleaf</groupId><artifactId>thymeleaf-layout-dialect</artifactId></dependency><dependency><groupId>com.github.mxab.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-data-attribute</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency></dependencies>
J
javaflex1 like
Aparentemente voce está usando Spring MVC. Então pesquisa algum tutorial sobre como configurar Bean Validation com Spring MVC. Exemplo:
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.
T
Solucao aceita
thimor
o erro de nao estar validando era uma merda…
@RequestMapping(value={"/cadastrar","{\\d+}"},method=RequestMethod.POST)publicModelAndViewsalvar(@ValidSecaosecao,BindingResultresult,RedirectAttributesattributes){if(result.hasErrors()){//ESTAVAFALTANDOUMRETURNAQUIRETURNcadastrar(secao);}secaoService.saveOrUpdate(secao);attributes.addFlashAttribute("mensagem","Seção cadastrada com sucesso!");returnnewModelAndView("redirect:/secoes");}