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

103

J'essaye d'écrire une application très simple avec le validateur d'hibernation:

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

gstackoverflow
la source
1
Mise à niveau de hibernate-validator pour 5.2.4.Finalrésoudre le problème pour moi.
fracz
1
@fracz J'ai hibernate-validator = 5.2.4.Finalet l'exception est toujours là.
Alfonso Nishikawa

Réponses:

154

Il fonctionne après l'ajout des pom.xmldé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 :

Hibernate Validator nécessite également une implémentation du langage d'expression unifié ( JSR 341 ) pour évaluer les expressions dynamiques dans les messages de violation de contrainte. Lorsque votre application s'exécute dans un conteneur Java EE tel que WildFly , une implémentation EL est déjà fournie par le conteneur. Dans un environnement Java SE, cependant, vous devez ajouter une implémentation en tant que dépendance à votre fichier POM. Par exemple, vous pouvez ajouter les deux dépendances suivantes pour utiliser l' implémentation de référence JSR 341 :

<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>
gstackoverflow
la source
5
Bean Validation 1.1 nécessite les dépendances du langage d'expression sur le chemin de classe. Voir aussi hibernate.org/validator/documentation/getting-started
Hardy
1
<dependency> <groupId> org.glassfish.web </groupId> <artifactId> javax.el </artifactId> <version> 2.2.4 </version> <scope> runtime </scope> </dependency> suffit car Le validateur d'hibernation dépend déjà de javax.el-api
mvera
8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>était suffisant pour moi
Sled
1
<dependency> <groupId> javax.el </groupId> <artifactId> el-api </artifactId> <version> 2.2 </version> </dependency> a résolu mon problème.
zhy2002
3
On dirait qu'ils recommandent les deux sur la page github pour les environnements SE: github.com/hibernate/hibernate-validator . Le top me suffisait cependant.
vphilipnyc
56

fais juste

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>
Bruno Lee
la source
8
Pourquoi ne compte-t-il pas hibernate-validatorsur cette dépendance?
thomas.mc.work
Je ne sais pas pourquoi mais ce serait mieux
Bruno Lee
@ thomas.mc.work Je pense que pour éviter les problèmes de dépendance transitive
gstackoverflow
1
Il est en fait marqué comme dépendance dans le fichier pom mais avec la portée maven de fourni. Cela signifie que vous êtes responsable de l'ajouter vous-même si votre serveur JavaEE n'en fournit pas un pour vous.
real_paul
Cette solution n'a pas fonctionné pour moi, j'utilise Hibernate Validator 6.0.4 et java.el de la version 3.0.0 et j'utilise WebLogic. Quelqu'un peut-il m'aider s'il vous plaît .. apprécié aider les mains à l'avance.
Kushwaha
18

Si vous utilisez tomcat comme runtime de votre serveur et que vous obtenez cette erreur dans les tests (car le runtime tomcat n'est pas disponible pendant les tests), il est logique d'inclure le runtime 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>
marcheurs
la source
Je t'aime. Oui.
xdhmoore
Je t'aime encore. Il semble que vous ne puissiez inclure que la tomcat-jasper-eldépendance, car elle semble inclure de manière transitoire la tomcat-el-apidépendance.
xdhmoore
13

Si vous utilisez Spring Boot avec des démarreurs - cette dépendance ajoute à la fois tomcat-embed-elet hibernate-validatordépendances:

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

Si vous n'avez pas besoin de javax.el (par exemple dans une application JavaSE), utilisez ParameterMessageInterpolator de Hibernate validator . Le validateur Hibernate est un composant autonome, qui peut être utilisé sans Hibernate lui-même.

Dépend du validateur d'hibernation

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

Utiliser ParameterMessageInterpolator

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();
Markus Schulte
la source
Ouais, je ne veux pas ajouter plus de dépendance. Bon travail
nokieng
Oh, c'est vraiment une bonne réponse pour moi concernant les projets de bibliothèque.
Jin Kwon
Cela devrait être la réponse choisie.
anataliocs
12

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

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.el</artifactId>
   <version>3.0.1-b11</version>
</dependency>
Herau
la source
4

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 de validation:

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();
    }
}
Le rasoir
la source
2

pour sbt, utilisez les versions ci-dessous

val glassfishEl = "org.glassfish" % "javax.el" % "3.0.1-b09"

val hibernateValidator = "org.hibernate.validator" % "hibernate-validator" % "6.0.17.Final"

val hibernateValidatorCdi = "org.hibernate.validator" % "hibernate-validator-cdi" % "6.0.17.Final"
Prathameshr
la source
1

Selon la documentation Getting started with Hibernate Validator , une implémentation du langage d'expression (EL) doit être fournie. Dans un environnement Java EE, il serait fourni par le conteneur. Cependant, dans une application autonome telle que la vôtre, elle doit être fournie.

Hibernate Validator nécessite également une implémentation du langage d'expression unifié (JSR 341) pour évaluer les expressions dynamiques dans les messages de violation de contrainte.

Lorsque votre application s'exécute dans un conteneur Java EE tel que WildFly, une implémentation EL est déjà fournie par le conteneur.

Dans un environnement Java SE, cependant, vous devez ajouter une implémentation en tant que dépendance à votre fichier POM. Par exemple, vous pouvez ajouter la dépendance suivante pour utiliser l'implémentation de référence JSR 341:

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.el</artifactId>
  <version></version>
</dependency>

L'exemple de dépendance de la documentation est un peu daté, car le langage d'expression est passé au projet Jakarta EE en 2018. Pour utiliser la version Jakarta EE du langage d'expression, ajoutez la dépendance Eclipse Glassfish EL suivante:

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>jakarta.el</artifactId>
   <version>3.0.3</version>
</dependency>

Il existe d'autres implémentations EL qui pourraient être utilisées autres que Glassfish. Par exemple, Spring Boot utilise par défaut Tomcat intégré . Cette version d'EL peut être utilisée comme suit:

<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-el</artifactId>
   <version>9.0.30</version>
</dependency>
M. Justin
la source
0

pour gradle:

compile 'javax.el:javax.el-api:2.2.4'
Borino
la source