javax.validation 입니다.확인예외:HV000183:'javax.el'을 로드할 수 없습니다.Expression Factory '
휴지 상태 검증기를 사용하여 매우 간단한 응용 프로그램을 작성하려고 합니다.
내 단계:
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에서는 제약 위반 메시지에서 동적 표현을 평가하기 위해 Unified Expression Language(JSR 341)가 구현되어 있어야 합니다.응용 프로그램이 WildFly와 같은 Java EE 컨테이너에서 실행되는 경우 컨테이너에서 EL 구현이 이미 제공됩니다.다만, Java SE 환경에서는, POM 파일에 의존해 실장을 추가할 필요가 있습니다.예를 들어, JSR 341 참조 실장을 사용하기 위해서, 다음의 2개의 의존 관계를 추가할 수 있습니다.
<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>
javax.el이 필요 없는 경우(예를 들어 JavaSE 응용 프로그램에서) ParameterMessage를 사용합니다.휴지 상태 검증기의 인터폴레이터.휴지 상태 검증기는 독립 실행형 구성 요소로, 휴지 상태 자체 없이 사용할 수 있습니다.
휴지 상태 검증기에 의존
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
Parameter Message 사용인터폴레이터
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();
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-el
★★★★★★★★★★★★★★★★★」hibernate-validator
★★★★★★★★★★★★★★★★★★:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
휴지 상태 검증 프로그램 문서 페이지에 대해서는, 다음의 항목에 대한 의존 관계를 정의할 필요가 있습니다.JSR-341
★★★★
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b11</version>
</dependency>
Hibernate Validator 에는 식 언어(EL)의 실장이 필요하지만, 실장은 포함되어 있지 않습니다.종속성을 추가하면 문제가 해결됩니다.
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>3.0.3</version>
</dependency>
이 요건에 대해서는, 「휴면 상태 검증의 개시」의 메뉴얼에 기재되어 있습니다.Java EE 환경에서는 컨테이너에 의해 제공됩니다.고객님의 어플리케이션과 같은 스탠드아론 어플리케이션에서는 이 어플리케이션을 제공해야 합니다.
또한 Hibernate Validator에서는 제약 위반 메시지에서 동적 표현을 평가하기 위해 Unified Expression Language(JSR 341)가 구현되어 있어야 합니다.
응용 프로그램이 WildFly와 같은 Java EE 컨테이너에서 실행되는 경우 컨테이너에서 EL 구현이 이미 제공됩니다.
다만, Java SE 환경에서는, POM 파일에 의존해 실장을 추가할 필요가 있습니다.예를 들어, JSR 341 참조 실장을 사용하려면 , 다음의 의존 관계를 추가할 수 있습니다.
<dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.el</artifactId> <version>${version.jakarta.el-api}</version> </dependency>
표현 언어 구현
몇 가지 EL 구현이 있습니다.하나는 문서에 언급된 자카르타 EE Glassfish 참조 구현입니다.다른 하나는 임베디드 Tomcat으로 현재 버전의 Spring Boot에서 기본적으로 사용됩니다.이 버전의 EL은 다음과 같이 사용할 수 있습니다.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.48</version>
</dependency>
이 코멘트에서 설명한 바와 같이 식언어의 호환 버전을 선택해야 합니다.Glassfish 구현은 Hibernate Validator의 제공된 범위 종속성으로 지정되므로 지정된 버전은 문제 없이 작동합니다.특히 Hibernate Validator 7은 Glassfish EL 구현 버전4를 사용하고 Hibernate 6은 버전3을 사용합니다.
스프링 부트
에서는 Spring Boot " " " "spring-boot-starter-validation
의존관계는 보통 휴지 상태 검증기 및 EL 라이브러리를 직접 지정하는 것이 아니라 사용됩니다.에는 둘 다 된다.org.hibernate.validator:hibernate-validator
★★★★★★★★★★★★★★★★★」tomcat-embed-el
.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.4.3.RELEASE</version>
</dependency>
자카르타 네임스페이스
Oracle에서 Eclipse Foundation으로 이전하는 과정에서 Java EE는 자카르타 EE로 이름이 변경됩니다.자카르타 EE 9에서 Java 패키지 이름이 변경되었습니다.javax.*
로로 합니다.jakarta.*
.
M의 대답 Justin은 자카르타에 대해서 옳다.더 많은 설명과 구체적인 예를 제공하기 위해 이 답변을 추가했습니다.
인터페이스와 구현
자카르타 Bean Validation은 Java API 사양입니다.이 규격의 이진 라이브러리에는 실행 코드가 아닌 인터페이스만 포함되어 있습니다.따라서 이러한 인터페이스의 구현도 필요합니다.
자카르타 Bean Validation 버전2 및 3 사양의 실장은 1개뿐입니다.휴지 상태 검증자 버전 6 및 7(각각)
데스크톱 및 콘솔 애플리케이션
웹 앱의 경우 자카르타 호환 웹 컨테이너는 Bean Validation을 수행하는 데 필요한 인터페이스와 구현을 제공합니다.
데스크톱 및 콘솔 앱에는 자카르타에 준거한 웹 컨테이너가 없습니다.따라서 인터페이스 jar와 구현 jar를 모두 앱에 번들해야 합니다.
메이븐, 그라들, Ivy 등의 의존관계 관리 도구를 사용하여 인터페이스 및 구현 jar를 다운로드 및 번들할 수 있습니다.
자카르타 표현 언어
자카르타 Bean Validation을 실행하려면 자카르타의 다른 툴도 필요합니다.Jakarta Expression Language는 표현식을 삽입하고 평가하기 위한 특수 목적 프로그래밍 언어입니다.자카르타 표현 언어는 단순히 EL이라고도 합니다.
자카르타 표현 언어는 자카르타 EE에 의해 인터페이스 항아리를 다운로드해야 하는 사양으로 정의됩니다.또, 이러한 인터페이스를 다른 항아리에 실장할 필요도 있습니다.
실장 방법은 선택할 수 있습니다.2021-03년 현재, 저는 Eclipse Foundation의 Eclipse Glassfish가 무료로 다운로드할 수 있는 별도의 라이브러리로 구현된 것을 알고 있습니다.IBM Corporation의 Open Liberty와 같은 다른 구현이 있을 수 있습니다.고객의 요구에 맞는 실장 방법을 찾아보세요.
Maven POM 의존관계
이 모든 정보를 종합하면 자카르타 빈 검증과 자카르타 표현 언어라는2개의 프로젝트 각각에 대해 인터페이스와 구현의 쌍이 4개의 jars가 필요합니다.
- 자카르타 빈 검증
- 인터페이스
- 실행
- 자카르타 표현 언어
- 인터페이스
- 실행
Maven이 선택 도구인 경우 Maven POM 파일에 추가해야 하는 4가지 종속성을 다음에 나타냅니다.
위에서 언급한 바와 같이, 제가 여기서 사용하는 Glassfish 라이브러리를 대체할 다른 EL 구현을 찾을 수 있을 것입니다.
<!--********| Jakarta Bean Validation |********-->
<!-- Interface -->
<!-- https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Implementation -->
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.1.Final</version>
</dependency>
<!-- Jakarta Expression Language -->
<!-- Interface -->
<!-- https://mvnrepository.com/artifact/jakarta.el/jakarta.el-api -->
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>4.0.0</version>
</dependency>
<!-- Implementation -->
<!-- https://mvnrepository.com/artifact/org.glassfish/jakarta.el -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.1</version>
</dependency>
하면 이 문제가 거예요.javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'
사용 예
간단한 클래스인 '보다'로 할 수 .Car
3개의 멤버필드에 대해 각각 검증을 실시하고 있습니다.
package work.basil.example.beanval;
import jakarta.validation.constraints.*;
public class Car
{
// ---------------| Member fields |----------------------------
@NotNull
private String manufacturer;
@NotNull
@Size ( min = 2, max = 14 )
private String licensePlate;
@Min ( 2 )
private int seatCount;
// ---------------| Constructors |----------------------------
public Car ( String manufacturer , String licensePlate , int seatCount )
{
this.manufacturer = manufacturer;
this.licensePlate = licensePlate;
this.seatCount = seatCount;
}
// ---------------| Object overrides |----------------------------
@Override
public String toString ( )
{
return "Car{ " +
"manufacturer='" + manufacturer + '\'' +
" | licensePlate='" + licensePlate + '\'' +
" | seatCount=" + seatCount +
" }";
}
}
또는 Java 16 이후를 사용하는 경우 보다 간략한 설명을 사용하십시오.
package work.basil.example.beanval;
import jakarta.validation.constraints.*;
public record Car (
@NotNull
String manufacturer ,
@NotNull
@Size ( min = 2, max = 14 )
String licensePlate ,
@Min ( 2 )
int seatCount
)
{
}
검증을 실행합니다. 정상적으로 된 상태로 합니다.Car
그러면 두 번째를 합니다.Car
3개의 필드 각각에 대해 1개의 제약조건을 위반하는 장애가 있는 오브젝트.
package work.basil.example.beanval;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import java.util.Set;
public class App
{
public static void main ( String[] args )
{
App app = new App();
app.demo();
}
private void demo ( )
{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// No violations.
{
Car car = new Car( "Honda" , "ABC-789" , 4 );
System.out.println( "car = " + car );
Set < ConstraintViolation < Car > > violations = validator.validate( car );
System.out.format( "INFO - Found %d violations.\n" , violations.size() );
}
// 3 violations.
{
Car car = new Car( null , "X" , 1 );
System.out.println( "car = " + car );
Set < ConstraintViolation < Car > > violations = validator.validate( car );
System.out.format( "INFO - Found %d violations.\n" , violations.size() );
violations.forEach( carConstraintViolation -> System.out.println( carConstraintViolation.getMessage() ) );
}
}
}
달릴 때.
car = Car{ manufacturer='Honda' | licensePlate='ABC-789' | seatCount=4 }
INFO - Found 0 violations.
car = Car{ manufacturer='null' | licensePlate='X' | seatCount=1 }
INFO - Found 3 violations.
must be greater than or equal to 2
must not be null
size must be between 2 and 14
Spring Boot을 사용하면 올바르게 동작합니다.스프링 리액티브 몽고까지.
<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();
}
}
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"
저도 같은 문제에 부딪혔는데 위의 답변은 도움이 되지 않았습니다.디버깅해서 찾아야 돼요
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0-cdh5.13.1</version>
<exclusions>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
</exclusions>
</dependency>
jsp-api를 빼고 나니 효과가 있었어요.
gradle의 경우:
compile 'javax.el:javax.el-api:2.2.4'
Hibernate Validator 7(org.hibernate.validator:hibernate-validator: 7.0.0.Final)을 자카르타 빈 검증 3.0 구현으로 사용하는 사용자는 다음 종속성을 사용해야 합니다.
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.0</version>
</dependency>
Hibernate Validator 매뉴얼에 기재되어 있는 바와 같이
오래된 테크놀로지에 얽매여 있기 때문에 다음 사항을 추가해야 했습니다.
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
다른 답변에서도 동일한 종속성이 보고되며, 버전만 업데이트했습니다.
언급URL : https://stackoverflow.com/questions/24386771/javax-validation-validationexception-hv000183-unable-to-load-javax-el-express
'sourcecode' 카테고리의 다른 글
Kotlin에서 익명 인터페이스 인스턴스를 작성하려면 어떻게 해야 합니까? (0) | 2022.11.07 |
---|---|
JSONObject를 사용하여 Java에서 올바른 JSONArray를 작성하는 방법 (0) | 2022.11.07 |
"wait_timeout"이 감소했음에도 불구하고 MariaDB 프로세스 목록에서 sleep 상태의 쿼리 수가 다수 감소함 (0) | 2022.11.07 |
Java 8 스트림이 비어 있는지 확인하는 방법 (0) | 2022.11.06 |
SQL에서 다른 테이블의 테이블에 데이터 삽입 (0) | 2022.11.06 |