javax.validation.ValidationException:HV000183:无法加载'javax.el.E​​xpressionFactory'


103

我尝试使用休眠验证器编写非常简单的应用程序:

我的步骤:

在pom.xml中添加以下依赖项:

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

编写代码:

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

    }
}

我得到以下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

我怎么了


1
升级休眠验证器以5.2.4.Final解决我的问题。
fracz

1
@fracz我有hibernate-validator = 5.2.4.Final并且异常仍然存在。
西川阿方索

Answers:


154

添加到pom.xml以下依赖项后,它可以工作:

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

Hibernate Validator入门

Hibernate Validator还需要实现统一表达式语言(JSR 341)来评估约束违例消息中的动态表达式。当您的应用程序在WildFly之类的Java EE容器中运行时,该容器已经提供了EL实现。但是,在Java SE环境中,必须将实现添加为对POM文件的依赖。例如,您可以添加以下两个依赖项以使用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要求在类路径上具有表达语言依赖项。另请参见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>足够休眠验证程序已经依赖于javax.el-api
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>对我来说足够了
雪橇2014年

1
<dependency> <groupId> javax.el </ groupId> <artifactId> el-api </ artifactId> <version> 2.2 </ version> </ dependency>解决了我的问题。
zhy2002'2014-10-7

3
看起来他们在SE环境的github页面上都推荐了这两种方法:github.com/hibernate/hibernate-validator。虽然对我来说,排名第一的就足够了。
vphilipnyc

56

只是做

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

8
为什么不hibernate-validator依靠这种依赖性?
thomas.mc.work,2015年

我不知道为什么,但是会更好
Bruno Lee

@ thomas.mc.work我想避免传递依赖问题
gstackoverflow

1
它实际上在pom文件中标记为依赖项,但具有提供的maven范围。这意味着如果您的JavaEE服务器没有为您提供服务器,则您有责任自己添加它。
real_paul

该解决方案对我不起作用,我正在使用休眠验证器6.0.4和3.0.0版本的java.el,并且正在使用WebLogic。谁能帮我。
库什瓦哈

18

如果您将tomcat用作服务器运行时,并且在测试中遇到此错误(因为tomcat运行时在测试期间不可用),则包含tomcat el运行时而不是glassfish中的运行时才有意义。这将是:

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

我爱你。是。
xdhmoore

还爱你。看起来您可以只包含tomcat-jasper-el依赖项,因为它似乎是在传递性地包含tomcat-el-api依赖项。
xdhmoore

13

如果您将Spring Boot与启动程序一起使用-此依赖项会同时添加tomcat-embed-elhibernate-validator依赖项:

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

13

如果你不需要javax.el(例如在JavaSE的应用程序),使用ParameterMessageInterpolatorHibernate的验证。Hibernate验证器是一个独立的组件,无需Hibernate本身即可使用。

依赖于休眠验证器

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

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

是的,我不想增加更多的依赖性。干得好
nokieng

哦,对于图书馆项目,这对我来说真的是一个很好的答案。
Jin Kwon

这应该是选择的答案。
出生

12

关于Hibernate验证器文档页面,您必须定义对JSR-341实现的依赖:

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

4

如果使用Spring Boot,这很好。即使使用Spring Reactive Mongo。

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

和验证配置:

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

对于sbt,请使用以下版本

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

根据《Hibernate Validator入门》文档,需要提供一种表达式语言(EL)实现。在Java EE环境中,它将由容器提供。但是,在您这样的独立应用程序中,需要提供它。

Hibernate Validator还需要实现统一表达式语言(JSR 341)来评估约束违例消息中的动态表达式。

当您的应用程序在WildFly之类的Java EE容器中运行时,该容器已经提供了EL实现。

但是,在Java SE环境中,必须将实现添加为对POM文件的依赖。例如,您可以添加以下依赖项以使用JSR 341参考实现:

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

文档的依赖项示例有些陈旧,因为表达式语言已在2018年过渡到Jakarta EE项目。要使用表达式语言的Jakarta EE版本,请添加以下Eclipse Glassfish EL依赖项:

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

除了Glassfish之外,还有其他可以使用的EL实现。例如,默认情况下,Spring Boot使用嵌入式Tomcat。此版本的EL可以按以下方式使用:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.