javax.validation.ValidationException: HV000183: 无法加载“javax.el.ExpressionFactory”
声明:本页面是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
javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'
提问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.xml
following 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 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-341
implementation:
关于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-el
and hibernate-validator
dependencies:
如果您将 Spring Boot 与 starters 一起使用 - 此依赖项会同时添加tomcat-embed-el
和hibernate-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的应用程序),使用ParameterMessageInterpolator从Hibernate的验证。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>