web-dev-qa-db-fra.com

javax.validation.ValidationException: HV000183: Impossible de charger 'javax.el.ExpressionFactory'

J'essaie d'écrire une application très simple avec le validateur Hibernate:

mes pas:

ajoutez la dépendance suivante dans pom.xml:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.1.Final</version>
</dependency>

écrire le code:

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);

    }
}

Et je reçois stacktrace suivant:

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

Qu'est-ce que je me trompe?

82
gstackoverflow

Cela fonctionne après avoir ajouté à pom.xml les dépendances suivantes:

<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>

Premiers pas avec Hibernate Validator

136
gstackoverflow

fais juste

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>
53
Bruno Marinho

Si vous utilisez Tomcat en tant que moteur d'exécution du serveur et que vous obtenez cette erreur lors des tests (car le moteur d'exécution de Tomcat n'est pas disponible pendant les tests), il est judicieux d'inclure le moteur d'exécution Tomcat el au lieu de celui de glassfish. Ce serait:

    <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>
12
walkeros

Concernant la page de documentation Hibernate validator , vous devez définir une dépendance à une implémentation de JSR-341:

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.el</artifactId>
   <version>3.0.1-b08</version>
</dependency>
10
herau

Si vous utilisez Spring Boot avec des démarreurs, cette dépendance ajoute les dépendances Tomcat-embed-el et hibernate-validator:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2
Michał Stochmal

Si vous utilisez Spring Boot, cela fonctionne bien. Même avec Spring Reactive Mongo.

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

et configuration config:

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();
    }
}
2
Razor

Si vous n'avez pas besoin de javax.el (par exemple, dans une application JavaSE), utilisez ParameterMessageInterpolator de 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();
0
Markus Schulte

pour grade:

compile 'javax.el:javax.el-api:2.2.4'
0
borino