javax.validation.ValidationException: HV000183: No se puede cargar 'javax.el.ExpressionFactory'

103

Intento escribir una aplicación muy simple con validador de hibernación:

mis pasos:

agregue la siguiente dependencia en pom.xml:

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

escribir código:

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

    }
}

Y obtengo el siguiente 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

¿Qué hago mal?

gstackoverflow
fuente
1
Actualizar hibernate-validator para 5.2.4.Finalresolverme el problema.
fracz
1
@fracz Tengo hibernate-validator = 5.2.4.Finaly la excepción todavía está ahí.
Alfonso Nishikawa

Respuestas:

154

Está funcionando después de agregar a las pom.xmlsiguientes dependencias:

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

Comenzando con Hibernate Validator :

Hibernate Validator también requiere una implementación del lenguaje de expresión unificado ( JSR 341 ) para evaluar expresiones dinámicas en mensajes de violación de restricciones. Cuando su aplicación se ejecuta en un contenedor Java EE como WildFly , el contenedor ya proporciona una implementación EL. En un entorno Java SE, sin embargo, debe agregar una implementación como dependencia a su archivo POM. Por ejemplo, puede agregar las siguientes dos dependencias para usar la implementación de referencia 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
fuente
5
Bean Validation 1.1 requiere las dependencias del lenguaje de expresión en la ruta de clases. Véase también 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> es suficiente ya que El validador de hibernación ya depende de javax.el-api
mvera
8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>fue suficiente para mí
Sled
1
<dependency> <groupId> javax.el </groupId> <artifactId> el-api </artifactId> <version> 2.2 </version> </dependency> resolvió mi problema.
zhy2002
3
Parece que recomiendan ambos en la página de github para entornos SE: github.com/hibernate/hibernate-validator . Sin embargo, el de arriba fue suficiente para mí.
vphilipnyc
56

haz solo

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>
Bruno Lee
fuente
8
¿Por qué no hibernate-validatorconfía en esa dependencia?
thomas.mc.work
No sé por qué pero sería mejor
Bruno Lee
@ thomas.mc.work Creo que para evitar problemas de dependencia transitiva
gstackoverflow
1
En realidad, está marcado como dependencia en el archivo pom pero con el alcance de maven proporcionado. Esto significa que usted es responsable de agregarlo usted mismo si su servidor JavaEE no le proporciona uno.
real_paul
Esta solución no funcionó para mí, estoy usando hibernate validator 6.0.4 y java.el de la versión 3.0.0 y estoy usando WebLogic. ¿Alguien puede ayudarme por favor? Se agradecen las manos de antemano.
Kushwaha
18

Si está utilizando tomcat como tiempo de ejecución del servidor y obtiene este error en las pruebas (porque el tiempo de ejecución de tomcat no está disponible durante las pruebas), tiene sentido incluir el tiempo de ejecución de tomcat el en lugar del de glassfish). Esto sería:

    <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
fuente
te quiero. Si.
xdhmoore
Aún te amo. Parece que puede incluir solo la tomcat-jasper-eldependencia, ya que parece incluir de forma transitiva la tomcat-el-apidependencia.
xdhmoore
13

Si está usando Spring Boot con arrancadores, esta dependencia agrega ambas tomcat-embed-ely hibernate-validatordependencias:

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

En caso de que no necesite javax.el (por ejemplo, en una aplicación JavaSE), use ParameterMessageInterpolator del validador de Hibernate . El validador de Hibernate es un componente independiente, que se puede utilizar sin Hibernate .

Depende del validador de hibernación

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

Utilice 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
fuente
Sí, no quiero agregar más dependencia. Buen trabajo
nokieng
Oh, esta es realmente una buena respuesta para mí con respecto a los proyectos de bibliotecas.
Jin Kwon
Esta debería ser la respuesta elegida.
anataliocs
4

Si usa Spring Boot, esto funciona bien. Incluso con Spring Reactive Mongo.

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

y configuración de validación:

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();
    }
}
Maquinilla de afeitar
fuente
2

para sbt, use las siguientes versiones

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

Según la documentación de Introducción a Hibernate Validator , se debe proporcionar una implementación de Lenguaje de expresión (EL) . En un entorno Java EE, lo proporcionaría el contenedor. Sin embargo, en una aplicación independiente como la suya, debe proporcionarse.

Hibernate Validator también requiere una implementación del lenguaje de expresión unificado (JSR 341) para evaluar expresiones dinámicas en mensajes de violación de restricciones.

Cuando su aplicación se ejecuta en un contenedor Java EE como WildFly, el contenedor ya proporciona una implementación EL.

En un entorno Java SE, sin embargo, debe agregar una implementación como dependencia a su archivo POM. Por ejemplo, puede agregar la siguiente dependencia para usar la implementación de referencia JSR 341:

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

El ejemplo de dependencia de la documentación está un poco anticuado, ya que el lenguaje de expresión pasó al proyecto Jakarta EE en 2018. Para usar la versión Jakarta EE del lenguaje de expresión, agregue la siguiente dependencia de Eclipse Glassfish EL:

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

Hay otras implementaciones de EL que podrían usarse además de Glassfish. Por ejemplo, Spring Boot usa Tomcat integrado de forma predeterminada . Esta versión de EL se puede utilizar de la siguiente manera:

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

para gradle:

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