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?


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>

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>

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>

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>

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

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

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"

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>

0

para gradle:

compile 'javax.el:javax.el-api:2.2.4'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.