javax.validation.ValidationException: HV000183: impossibile caricare "javax.el.ExpressionFactory"


103

Provo a scrivere un'applicazione molto semplice con il validatore di ibernazione:

i miei passi:

aggiungi la seguente dipendenza in pom.xml:

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

scrivi codice:

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

    }
}

E ottengo il seguente 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

Cosa sbaglio?


1
Aggiornamento di hibernate-validator al 5.2.4.Finalproblema risolto per me.
fracz

1
@fracz ho hibernate-validator = 5.2.4.Finale l'eccezione è ancora lì.
Alfonso Nishikawa

Risposte:


154

Funziona dopo l'aggiunta alle pom.xmlseguenti dipendenze:

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

Iniziare con Hibernate Validator :

Hibernate Validator richiede anche un'implementazione di Unified Expression Language ( JSR 341 ) per la valutazione delle espressioni dinamiche nei messaggi di violazione dei vincoli. Quando l'applicazione viene eseguita in un contenitore Java EE come WildFly , un'implementazione EL è già fornita dal contenitore. In un ambiente Java SE, tuttavia, è necessario aggiungere un'implementazione come dipendenza al file POM. Ad esempio, puoi aggiungere le seguenti due dipendenze per utilizzare l' implementazione di riferimento 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>

5
Bean Validation 1.1 richiede le dipendenze di Expression Language sul classpath. Vedi anche 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> è sufficiente in quanto Il validatore di ibernazione dipende già da javax.el-api
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>era sufficiente per me
Sled il

1
<dependency> <groupId> javax.el </groupId> <artifactId> el-api </artifactId> <version> 2.2 </version> </dependency> ha risolto il mio problema.
zhy2002

3
Sembra che raccomandino entrambi sulla pagina github per ambienti SE: github.com/hibernate/hibernate-validator . Quello in alto però è stato sufficiente per me.
vphilipnyc

56

fai solo

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

8
Perché non fa hibernate-validatoraffidamento su quella dipendenza?
thomas.mc.work

Non so perché ma sarebbe meglio
Bruno Lee

@ thomas.mc.work Penso per evitare problemi di dipendenza transitiva
gstackoverflow

1
In realtà è contrassegnato come dipendenza nel file pom ma con l'ambito di prova fornito. Ciò significa che sei responsabile di aggiungerlo da solo se il tuo server JavaEE non ne fornisce uno.
real_paul

Questa soluzione non ha funzionato per me, sto usando il validatore hibernate 6.0.4 e java.el della versione 3.0.0 e sto usando WebLogic. Qualcuno può aiutarmi ... apprezzato in anticipo le mani d'aiuto.
Kushwaha

18

Se stai usando tomcat come runtime del server e ottieni questo errore nei test (perché il runtime tomcat non è disponibile durante i test) ha senso includere tomcat el runtime invece di quello di glassfish). Questo sarebbe:

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

Ti amo. Sì.
xdhmoore

Ti amo ancora. Sembra che tu possa includere solo la tomcat-jasper-eldipendenza, poiché sembra includere transitivamente la tomcat-el-apidipendenza.
xdhmoore

13

Se stai usando avvio primavera con antipasti - questa dipendenza aggiunge sia tomcat-embed-ele hibernate-validatorle dipendenze:

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

13

Nel caso in cui non sia necessario javax.el (ad esempio in un'applicazione JavaSE), utilizzare ParameterMessageInterpolator dal validatore Hibernate . Il validatore Hibernate è un componente autonomo, che può essere utilizzato senza lo stesso Hibernate .

Dipende dal validatore di ibernazione

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

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

Sì, non voglio aggiungere più dipendenza. Buon lavoro
nokieng

Oh, questa è davvero una buona risposta per me riguardo ai progetti bibliotecari.
Jin Kwon

Questa dovrebbe essere la risposta scelta.
anataliocs


4

Se si utilizza Spring Boot, funziona bene. Anche con Spring Reactive Mongo.

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

e configurazione di convalida:

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

per sbt, usa le versioni seguenti

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"

1

Secondo la documentazione Getting started with Hibernate Validator , è necessario fornire un'implementazione di Expression Language (EL) . In un ambiente Java EE, sarebbe fornito dal contenitore. Tuttavia, in un'applicazione standalone come la tua, deve essere fornito.

Hibernate Validator richiede anche un'implementazione di Unified Expression Language (JSR 341) per la valutazione delle espressioni dinamiche nei messaggi di violazione dei vincoli.

Quando l'applicazione viene eseguita in un contenitore Java EE come WildFly, un'implementazione EL è già fornita dal contenitore.

In un ambiente Java SE, tuttavia, è necessario aggiungere un'implementazione come dipendenza al file POM. Ad esempio, puoi aggiungere la seguente dipendenza per utilizzare l'implementazione di riferimento JSR 341:

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

L'esempio di dipendenza della documentazione è un po 'datato, poiché il linguaggio delle espressioni è passato al progetto Jakarta EE nel 2018. Per utilizzare la versione Jakarta EE del linguaggio delle espressioni, aggiungere la seguente dipendenza Eclipse Glassfish EL:

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

Esistono altre implementazioni EL che potrebbero essere utilizzate oltre a Glassfish. Ad esempio, Spring Boot per impostazione predefinita utilizza Tomcat incorporato . Questa versione di EL può essere utilizzata come segue:

<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-el</artifactId>
   <version>9.0.30</version>
</dependency>

0

per gradle:

compile 'javax.el:javax.el-api:2.2.4'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.