[java] javax.validation.ValidationException : HV000183 : ‘javax.el.ExpressionFactory’를로드 할 수 없습니다.

최대 절전 유효성 검사기로 매우 간단한 응용 프로그램을 작성하려고합니다.

내 단계 :

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

내가 뭘 잘못 했어?



답변

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>

답변

그냥 해

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


답변

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>


답변

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

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


답변

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


답변

Hibernate 유효성 검사기 문서 페이지 와 관련하여 JSR-341구현에 대한 종속성을 정의해야합니다 .

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


답변

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