Ich versuche eine sehr einfache Anwendung mit Hibernate-Validator zu schreiben:
meine Schritte:
fügen Sie in pom.xml folgende Abhängigkeit hinzu:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>
code schreiben:
class Configuration {
Range(min=1,max=100)
int threadNumber;
//...
public static void main(String[] args) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Configuration configuration = new Configuration();
configuration.threadNumber = 12;
//...
Set<ConstraintViolation<Configuration>> constraintViolations = validator.validate(configuration);
System.out.println(constraintViolations);
}
}
Und ich bekomme folgenden Stacktrace:
Exception in thread "main" javax.validation.ValidationException: Unable to instantiate Configuration.
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.Java:279)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.Java:110)
...
at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.Java:110)
at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.Java:86)
at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.Java:41)
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.Java:276)
... 2 more
Was mache ich falsch?
Es funktioniert, nachdem pom.xml
folgende Abhängigkeiten hinzugefügt wurde:
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>
mach einfach
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
Wenn Sie Tomcat als Serverlaufzeit verwenden und dieser Fehler in Tests angezeigt wird (da die Tomcat-Laufzeit während der Tests nicht verfügbar ist), ist es sinnvoll, die Tomcat el-Laufzeit anstelle der Laufzeit von glassfish zu verwenden. Das wäre:
<dependency>
<groupId>org.Apache.Tomcat</groupId>
<artifactId>Tomcat-el-api</artifactId>
<version>8.5.14</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.Apache.Tomcat</groupId>
<artifactId>Tomcat-jasper-el</artifactId>
<version>8.5.14</version>
<scope>test</scope>
</dependency>
In Bezug auf die Hibernate-Validierungsdokumentationsseite müssen Sie eine Abhängigkeit von einer JSR-341
-Implementierung definieren:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
Wenn Sie Spring Boot mit Startern verwenden, fügt diese Abhängigkeit Tomcat-embed-el
und hibernate-validator
Abhängigkeiten hinzu:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Wenn Sie Spring Boot verwenden, funktioniert das gut. Auch bei Spring Reactive Mongo.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
und Validierungskonfiguration:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class MongoValidationConfig {
@Bean
public ValidatingMongoEventListener validatingMongoEventListener() {
return new ValidatingMongoEventListener(validator());
}
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
}
Falls Sie javax.el nicht benötigen (z. B. in einer JavaSE-Anwendung), verwenden Sie den ParameterMessageInterpolator von Hibernate
import javax.validation.Validation;
import javax.validation.Validator;
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;
private static final Validator VALIDATOR =
Validation.byDefaultProvider()
.configure()
.messageInterpolator(new ParameterMessageInterpolator())
.buildValidatorFactory()
.getValidator();
für gradle:
compile 'javax.el:javax.el-api:2.2.4'