Próbuję napisać bardzo prostą aplikację z walidatorem hibernacji:
moje kroki:
dodaj następującą zależność w pom.xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>
napisz kod:
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);
}
}
Otrzymuję następujący 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
Co się mylę?
java
hibernate
validation
maven
hibernate-validator
gstackoverflow
źródło
źródło
5.2.4.Final
rozwiązania dla mnie problemu.5.2.4.Final
i wyjątek nadal istnieje.Odpowiedzi:
Działa po dodaniu do
pom.xml
następujących zależności:Pierwsze kroki z Hibernate Validator :
źródło
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>
było dla mnie wystarczającerób po prostu
źródło
hibernate-validator
polegać na tej zależności?Jeśli używasz tomcat jako środowiska wykonawczego serwera i otrzymujesz ten błąd w testach (ponieważ środowisko uruchomieniowe tomcat nie jest dostępne podczas testów), sensowne jest włączenie tomcat el runtime zamiast tego z glassfish). To byłoby:
źródło
tomcat-jasper-el
zależność, ponieważ wydaje się, że zawiera ona przejściowotomcat-el-api
zależność.Jeśli używasz rozruchu sprężynowego ze starterami - ta zależność dodaje oba
tomcat-embed-el
ihibernate-validator
zależności:źródło
Jeśli nie potrzebujesz javax.el (na przykład w aplikacji JavaSE), użyj ParameterMessageInterpolator z walidatora Hibernate . Walidator Hibernate jest samodzielnym komponentem, którego można używać bez samego Hibernacji .
Zależy od hibernacji-walidatora
Użyj ParameterMessageInterpolator
źródło
Jeśli chodzi o stronę dokumentacji walidatora Hibernate , musisz zdefiniować zależność od
JSR-341
implementacji:źródło
Jeśli używasz Spring Boot, działa to dobrze. Nawet z Spring Reactive Mongo.
i konfiguracja walidacji:
źródło
dla sbt użyj poniższych wersji
źródło
Zgodnie z dokumentacją Getting started with Hibernate Validator , należy zapewnić implementację języka wyrażeń (EL) . W środowisku Java EE byłoby to dostarczane przez kontener. Jednak w przypadku samodzielnej aplikacji, takiej jak Twoja, należy ją podać.
Przykład zależności w dokumentacji jest nieco przestarzały, ponieważ język wyrażeń został przeniesiony do projektu Jakarta EE w 2018 r. Aby użyć wersji Jakarta EE języka wyrażeń, dodaj następującą zależność Eclipse Glassfish EL:
Istnieją inne implementacje EL, które mogą być użyte, inne niż Glassfish. Na przykład Spring Boot domyślnie używa wbudowanego Tomcata . Ta wersja EL może być używana w następujący sposób:
źródło
dla gradle:
źródło