Java – Lo starter di validation in Spring Boot 2.3

Spring Boot 2.3 è disponibile da poco tempo ed ha introdotto un cambiamento rilevante riguardo lo starter per la validazione (con la Bean Validation API). Me ne sono accorto personalmente qualche giorno fa quando ho creato un nuovo progettino con Spring Boot decidendo di iniziare subito con la versione 2.3.0.

Fino alla versione 2.2 di Spring Boot lo starter spring-boot-starter-web aveva come dipendenza lo starter spring-boot-starter-validation che a sua volta ha come dipendenza la ben nota hibernate-validator (la implementazione “di riferimento” della Bean Validation API).

Tutto questo risulta ben evidente dalla dependency tree che si può ottenere con Maven:

\- org.springframework.boot:spring-boot-starter-web:jar:2.2.8.RELEASE:compile
   +- org.springframework.boot:spring-boot-starter:jar:2.2.8.RELEASE:compile
   |       .....altro.....
   +- org.springframework.boot:spring-boot-starter-json:jar:2.2.8.RELEASE:compile
   |       .....altro.....
   +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.2.8.RELEASE:compile
   |       .....altro.....
   +- org.springframework.boot:spring-boot-starter-validation:jar:2.2.8.RELEASE:compile
   |  +- jakarta.validation:jakarta.validation-api:jar:2.0.2:compile
   |  \- org.hibernate.validator:hibernate-validator:jar:6.0.20.Final:compile
   |     +- org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile
   |     \- com.fasterxml:classmate:jar:1.5.1:compile
   +- org.springframework:spring-web:jar:5.2.7.RELEASE:compile
   |  \- org.springframework:spring-beans:jar:5.2.7.RELEASE:compile
   \- org.springframework:spring-webmvc:jar:5.2.7.RELEASE:compile
      +- org.springframework:spring-aop:jar:5.2.7.RELEASE:compile
      +- org.springframework:spring-context:jar:5.2.7.RELEASE:compile
      \- org.springframework:spring-expression:jar:5.2.7.RELEASE:compile

In Spring Boot 2.3 lo starter spring-boot-starter-validation NON è più una dipendenza dello starter spring-boot-starter-web. La motivazione razionale che è stata data è che: non tutte le web application devono usare la validazione. Quindi si è deciso di rendere più leggero ed efficiente il setup per quelle web application che non hanno bisogno della validazione.

Questa variazione è ben evidente sempre dalla dependency tree:

\- org.springframework.boot:spring-boot-starter-web:jar:2.3.0.RELEASE:compile
   +- org.springframework.boot:spring-boot-starter:jar:2.3.0.RELEASE:compile
   |       .....altro.....
   +- org.springframework.boot:spring-boot-starter-json:jar:2.3.0.RELEASE:compile
   |       .....altro.....
   +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.3.0.RELEASE:compile
   |       .....altro.....
   +- org.springframework:spring-web:jar:5.2.6.RELEASE:compile
   |  \- org.springframework:spring-beans:jar:5.2.6.RELEASE:compile
   \- org.springframework:spring-webmvc:jar:5.2.6.RELEASE:compile
      +- org.springframework:spring-aop:jar:5.2.6.RELEASE:compile
      +- org.springframework:spring-context:jar:5.2.6.RELEASE:compile
      \- org.springframework:spring-expression:jar:5.2.6.RELEASE:compile

Lo starter spring-boot-starter-validation è assente. Con Spring Boot 2.3+ se si vuole usare lo starter di validation, è necessario aggiungerlo esplicitamente.

Con Maven (in <dependencies>):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Con Gradle (in dependencies { }):

implementation 'org.springframework.boot:spring-boot-starter-validation'

Da notate che la nuova versione dello starter spring-boot-starter-validation è stata leggermente modificata. Infatti le sue dipendenze risultano essere:

\- org.springframework.boot:spring-boot-starter-validation:jar:2.3.0.RELEASE:compile
   +- org.glassfish:jakarta.el:jar:3.0.3:compile
   \- org.hibernate.validator:hibernate-validator:jar:6.1.5.Final:compile
      +- jakarta.validation:jakarta.validation-api:jar:2.0.2:compile
      +- org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile
      \- com.fasterxml:classmate:jar:1.5.1:compile