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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24386771/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 11:54:27  来源:igfitidea点击:

javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'

javahibernatevalidationmavenhibernate-validator

提问by gstackoverflow

I try to write very simple application with hibernate validator:

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

my steps:

我的步骤:

add following dependency in pom.xml:

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

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

write code:

写代码:

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

    }
}

And I gets following 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

What do I wrong?

我怎么了?

采纳答案by gstackoverflow

It is working after adding to pom.xmlfollowing dependencies:

添加到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>

Getting started with Hibernate Validator:

Hibernate Validator 入门

Hibernate Validator also requires an implementation of the Unified Expression Language (JSR 341) for evaluating dynamic expressions in constraint violation messages. When your application runs in a Java EE container such as WildFly, an EL implementation is already provided by the container. In a Java SE environment, however, you have to add an implementation as dependency to your POM file. For instance you can add the following two dependencies to use the JSR 341 reference implementation:

<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 还需要统一表达式语言 ( JSR 341) 的实现来评估约束违反消息中的动态表达式。当您的应用程序在 Java EE 容器(例如WildFly )中运行时,容器已经提供了 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>

回答by Bruno Lee

do just

只做

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

回答by walkeros

If you are using tomcat as your server runtime and you get this error in tests (because tomcat runtime is not available during tests) than it makes make sense to include tomcat el runtime instead of the one from glassfish). This would be:

如果您使用 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>

回答by herau

Regarding the Hibernate validator documentation page, you have to define a dependency to a JSR-341implementation:

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

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

回答by borino

for gradle :

对于 gradle :

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

回答by Micha? Stochmal

If you're using spring boot with starters - this dependency adds both tomcat-embed-eland hibernate-validatordependencies:

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

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

回答by Razor

If using Spring Boot this works well. Even with Spring Reactive Mongo.

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

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

and validation config:

和验证配置:

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

回答by Markus Schulte

In case you don't need javax.el(for example in a JavaSE application), use ParameterMessageInterpolatorfrom Hibernate validator. Hibernate validator is a standalone component, which can be used without Hibernateitself.

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

Depend on hibernate-validator

依赖休眠验证器

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

Use ParameterMessageInterpolator

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

回答by prathameshr

for sbt, use below versions

对于 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"

回答by M. Justin

Per the Getting started with Hibernate Validatordocumentation, an Expression Language (EL)implementation needs to be provided. In a Java EE environment, it would be provided by the container. However, in a standalone application such as yours, it needs to be provided.

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

Hibernate Validator also requires an implementation of the Unified Expression Language (JSR 341) for evaluating dynamic expressions in constraint violation messages.

When your application runs in a Java EE container such as WildFly, an EL implementation is already provided by the container.

In a Java SE environment, however, you have to add an implementation as dependency to your POM file. For instance, you can add the following dependency to use the JSR 341 reference implementation:

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

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

当您的应用程序在 Java EE 容器(例如 WildFly)中运行时,容器已经提供了 EL 实现。

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

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

The documentation's dependency example is a bit dated, as the expression language transitioned to the Jakarta EE projectin 2018. To use the Jakarta EE version of the expression language, add the following Eclipse GlassfishEL dependency:

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

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

There are other EL implementations that could be used other than Glassfish. For instance, Spring Bootby default uses embedded Tomcat. This version of EL can be used as follows:

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

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