Migré un proyecto Spring Boot de 2.2.5 a 2.3.0 y después de eso, las validaciones dejaron de funcionar (no se invocan en absoluto).
Leí en la documentación del registro de cambios ( https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3.0-M1-Release-Notes ), que spring-boot-starter-validation ahora necesita agregarse manualmente como una dependencia.
Entonces, lo agregué a mi pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>Mi padre pom es:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath></relativePath> </parent>Mi controlador se ve así:
@PostMapping( value = "/signup", consumes = MediaType.APPLICATION_JSON_VALUE ) @ResponseStatus( value = HttpStatus.OK ) public void signUp( @Valid @RequestBody ClientDto clientDto ) { onboardingService.signUp( clientDto ); }EDITAR:
¡PUEDO ENCONTRAR EL PROBLEMA, COMPRUEBA MI RESPUESTA A CONTINUACIÓN!
¡Gracias a todos por su ayuda!
Hola, debe anotar su clase de controlador con la anotación @Validated vea el ejemplo a continuación:
Para fines de prueba, intente comentar la anotación @Validated , no notará javax.validation.ConstraintViolationException: hello.name: size must be between 4 and 10 pero una vez que lo vuelve a colocar, funciona nuevamente. Más información técnica aquí Diferencia entre @Valid y @Validated en Spring
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Validated @RestController @RequestMapping("/hello") class HelloController { @GetMapping public String hello(@Valid @NotNull(message = "Name cannot be empty") @Size(min = 4, max = 10) @RequestParam("name") String name) { return "Hello, " + name + "!"; } } } <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>El iniciador de validación ya no se incluye en los iniciadores web.
Spring-boot-starter-validation ya no es una dependencia transitiva de spring-boot-starter-web y spring-boot-starter-webflux.
Agregue esta dependencia para el trabajo de validaciones.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>En realidad hubo error en las pruebas unitarias. La validación estaba funcionando bien.
Para aquellos que vinieron aquí con el mismo problema, es muy probable que no agreguen la siguiente dependencia al pom.xml como Braian Silva sugirió anteriormente:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>¡Gracias por su ayuda chicos!
Tengo un problema similar aquí. Pero en mi caso, la validación me advierte que falta una secuencia en el esquema de Oracle, pero está ahí. Creo que es un error. Seguiré con la versión 2.4.0 por un tiempo.
De acuerdo con la versión Spring Boot 2.3.1, ya no contiene Spring-Boot-Starter-validation con Spring Starter.
cómo agregar la validación de inicio en
experto
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>gradle
dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-validation' }arbitrar la nota de lanzamiento
Si experimenta el problema de, por ejemplo: no poder ver los errores de validación (mensajes predeterminados) devueltos al cliente, esto es lo que podría hacer:
Solución principal 1: simplemente agregue devtools. Esto debería resolver el problema. Después de hacer esto, todos mis resultados vinculantes se devolvieron al cliente. Te recomiendo que pruebes esto primero:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>Solución 2:
Descubrí que esto se debe al uso de Spring Boot 2.3+ Entonces, si está usando Spring Boot 2.3 o superior, agregue esta dependencia en su archivo pom.xml ya que ya no está incluida dentro de la dependencia 'web' en sí.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>Ahora es necesario establecer 'incluir errores de vinculación' en java/resources/application.properties en "siempre". Lo mismo ocurre con el 'mensaje', aunque creo que esto es opcional.
server.error.include-message=always server.error.include-binding-errors=alwaysSolución 3: (antes de descubrir la solución 2 que también podría ser útil)
Entonces descubrí que esto se debe a que Spring Boot 2.3+. Pero no pude encontrar mensajes de precaución sobre el nuevo uso actualizado de @Valid en Spring Boot v2.3+.
Así que terminé volviendo a Spring boot v2.2.10 (última versión de 2.2) ajustando la versión de lanzamiento en el archivo pom.xml de esta manera:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>Esto funcionó perfectamente para mí al volver a una versión anterior. Aunque me gustaría actualizar mi versión de Spring Boot algún día. (Revise la solución 1 y 2)
Una solución simple al problema anterior es agregar:
<repositories> <repository> <id>Central Maven repository</id> <name>Central Maven repository https</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>a su archivo POM.xml. Esto solucionará el problema con esta versión.
Vipul.