javax.validation.ValidationException: HV000183: 'javax.el.ExpressionFactory' kann nicht geladen werden.

103

Ich versuche, eine sehr einfache Anwendung mit Hibernate Validator zu schreiben:

meine Schritte:

Fügen Sie die folgende Abhängigkeit in pom.xml 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?

gstackoverflow
quelle
1
Upgrade des Hibernate-Validators auf ein 5.2.4.Finalfür mich gelöstes Problem.
Fracz
1
@fracz Ich habe Hibernate-Validator = 5.2.4.Finalund die Ausnahme ist immer noch da.
Alfonso Nishikawa

Antworten:

154

Es funktioniert nach dem Hinzufügen zu pom.xmlfolgenden Abhängigkeiten:

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

Erste Schritte mit Hibernate Validator :

Der Hibernate Validator erfordert auch eine Implementierung der Unified Expression Language ( JSR 341 ) zum Auswerten dynamischer Ausdrücke in Nachrichten mit Einschränkungsverletzungen. Wenn Ihre Anwendung in einem Java EE-Container wie WildFly ausgeführt wird , wird vom Container bereits eine EL-Implementierung bereitgestellt. In einer Java SE-Umgebung müssen Sie Ihrer POM-Datei jedoch eine Implementierung als Abhängigkeit hinzufügen. Sie können beispielsweise die folgenden zwei Abhängigkeiten hinzufügen, um die JSR 341- Referenzimplementierung zu verwenden :

<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
quelle
5
Für die Bean-Validierung 1.1 sind die Abhängigkeiten der Ausdruckssprache vom Klassenpfad erforderlich. Siehe auch hibernate.org/validator/documentation/getting-started
Hardy
1
<dependency> <groupId> org.glassfish.web </ groupId> <artifactId> javax.el </ifactId> <version> 2.2.4 </ version> <scope> Laufzeit </ scope> </ dependency> ist ausreichend als Hibernate Validator hängt bereits von javax.el-api
mvera
8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>war ausreichend für mich
Schlitten
1
<dependency> <groupId> javax.el </ groupId> <artifactId> el-api </ifactId> <version> 2.2 </ version> </ dependency> hat mein Problem gelöst.
zhy2002
3
Sieht so aus, als würden sie beide auf der Github-Seite für SE-Umgebungen empfehlen: github.com/hibernate/hibernate-validator . Das oberste hat mir allerdings gereicht.
Vphilipnyc
56

mach es einfach

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>
Bruno Lee
quelle
8
Warum verlässt man sich nicht hibernate-validatorauf diese Abhängigkeit?
Thomas.mc.work
Ich weiß nicht warum, aber es wäre besser
Bruno Lee
@ thomas.mc.work Ich denke, um transitive Abhängigkeitsprobleme zu vermeiden
gstackoverflow
1
Es ist tatsächlich als Abhängigkeit in der POM-Datei markiert, aber mit dem Maven-Bereich von bereitgestellt. Dies bedeutet, dass Sie dafür verantwortlich sind, es selbst hinzuzufügen, wenn Ihr JavaEE-Server keinen für Sie bereitstellt.
Real_Paul
Diese Lösung hat bei mir nicht funktioniert. Ich verwende den Hibernate Validator 6.0.4 und java.el der Version 3.0.0 und verwende WebLogic. Kann mir bitte jemand helfen .. sehr dankbar, dass ich im Voraus helfen kann.
Kushwaha
18

Wenn Sie Tomcat als Server-Laufzeit verwenden und diesen Fehler in Tests erhalten (da die Tomcat-Laufzeit während der Tests nicht verfügbar ist), ist es sinnvoll, die Tomcat el-Laufzeit anstelle der von glassfish einzuschließen. 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>
Walkeros
quelle
Ich liebe dich. Ja.
xdhmoore
Liebe dich noch immer. Es sieht so aus, als könnten Sie nur die tomcat-jasper-elAbhängigkeit einschließen , da sie die tomcat-el-apiAbhängigkeit transitiv einzuschließen scheint .
xdhmoore
13

Wenn Sie Spring Boot mit Startern verwenden, fügt diese Abhängigkeit sowohl tomcat-embed-elals auch hibernate-validatorAbhängigkeiten hinzu:

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

Wenn Sie javax.el nicht benötigen (z. B. in einer JavaSE-Anwendung), verwenden Sie ParameterMessageInterpolator vom Hibernate-Validator . Der Hibernate-Validator ist eine eigenständige Komponente, die ohne Hibernate selbst verwendet werden kann.

Abhängig vom Ruhezustand-Validator

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

Verwenden Sie 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
quelle
Ja, ich möchte keine weitere Abhängigkeit hinzufügen. Gute Arbeit
Nokia
Oh, das ist wirklich eine gute Antwort für mich in Bezug auf Bibliotheksprojekte.
Jin Kwon
Dies sollte die gewählte Antwort sein.
Anataliocs
12

In Bezug auf die Dokumentationsseite des Hibernate-Validators müssen Sie eine Abhängigkeit von einer JSR-341Implementierung definieren:

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

Wenn Sie Spring Boot verwenden, funktioniert dies gut. Auch mit 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();
    }
}
Rasierer
quelle
2

Verwenden Sie für sbt die folgenden Versionen

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

Pro die mit Hibernate Validator Getting Started Dokumentation, eine Expression Language (EL) muss die Umsetzung zur Verfügung gestellt werden. In einer Java EE-Umgebung würde dies vom Container bereitgestellt. In einer eigenständigen Anwendung wie Ihrer muss diese jedoch bereitgestellt werden.

Der Hibernate Validator erfordert auch eine Implementierung der Unified Expression Language (JSR 341) zum Auswerten dynamischer Ausdrücke in Nachrichten mit Einschränkungsverletzungen.

Wenn Ihre Anwendung in einem Java EE-Container wie WildFly ausgeführt wird, wird vom Container bereits eine EL-Implementierung bereitgestellt.

In einer Java SE-Umgebung müssen Sie Ihrer POM-Datei jedoch eine Implementierung als Abhängigkeit hinzufügen. Sie können beispielsweise die folgende Abhängigkeit hinzufügen, um die JSR 341-Referenzimplementierung zu verwenden:

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

Das Abhängigkeitsbeispiel der Dokumentation ist etwas veraltet, da die Ausdruckssprache 2018 auf das Jakarta EE-Projekt umgestellt wurde. Um die Jakarta EE-Version der Ausdruckssprache zu verwenden, fügen Sie die folgende Eclipse Glassfish EL-Abhängigkeit hinzu:

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

Es gibt andere EL-Implementierungen, die anders als Glassfish verwendet werden könnten. Beispielsweise verwendet Spring Boot standardmäßig eingebettetes Tomcat . Diese Version von EL kann wie folgt verwendet werden:

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

für gradle:

compile 'javax.el:javax.el-api:2.2.4'
Borino
quelle