javax.validation.ValidationException : HV000183 : 'javax.el.ExpressionFactory'를로드 할 수 없습니다.


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

    }
}

그리고 다음과 같은 스택 추적을 얻습니다.

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있고 예외가 여전히 있습니다.
Alfonso Nishikawa 2016 년

답변:


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에는 클래스 경로에 대한 Expression Language 종속성이 필요합니다. 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>는 hibernate 유효성 검사기는 이미 javax.el-api에 의존합니다
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>나를 위해 충분했다
썰매

1
<dependency> <groupId> javax.el </ groupId> <artifactId> el-api </ artifactId> <version> 2.2 </ version> </ dependency>가 내 문제를 해결했습니다.
zhy2002 2014 년

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

난 이유를 모르겠어하지만 더 나은 것
브루노 리

@ thomas.mc.work 전이적인 의존성 문제를 피하기 위해 생각합니다
gstackoverflow

1
실제로 pom 파일에서 종속성으로 표시되지만 maven 범위가 제공됩니다. 즉, JavaEE 서버에서 제공하지 않는 경우 직접 추가해야합니다.
real_paul

이 솔루션은 나를 위해 작동하지 않았으며 최대 절전 유효성 검사기 6.0.4 및 3.0.0 버전의 java.el을 사용하고 있으며 WebLogic을 사용하고 있습니다. 누구든지 도와 주시겠습니까 .. 미리 도와 주셔서 감사합니다.
Kushwaha

18

tomcat을 서버 런타임으로 사용하고 테스트에서이 오류가 발생하는 경우 (테스트 중에 tomcat 런타임을 사용할 수 없기 때문에) glassfish의 런타임 대신 tomcat el 런타임을 포함하는 것이 합리적입니다. 이것은 다음과 같습니다.

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

여전히 당신을 사랑합니다. tomcat-jasper-el종속성을 전 이적으로 포함하는 것처럼 보이기 때문에 종속성 만 포함 할 수있는 것 같습니다 tomcat-el-api.
xdhmoore 19

13

스타터와 함께 스프링 부트를 사용하는 경우-이 종속성은 tomcat-embed-elhibernate-validator종속성을 모두 추가합니다 .

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

13

javax.el이 필요하지 않은 경우 (예 : JavaSE 애플리케이션) Hibernate validator의 ParameterMessageInterpolator 를 사용하십시오 . 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();

네, 더 많은 의존성을 추가하고 싶지 않습니다. Good job
nokieng

오, 이것은 도서관 프로젝트와 관련하여 저에게 정말 좋은 대답입니다.
Jin Kwon

이것은 선택된 대답이어야합니다.
anataliocs


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

(가) 당 최대 절전 모드 검사기 시작하기 문서, 표현 언어 (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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.