최대 절전 유효성 검사기로 매우 간단한 응용 프로그램을 작성하려고합니다.
내 단계 :
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는 또한 제약 위반 메시지에서 동적 표현을 평가하기위한 통합 표현 언어 ( 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-el
및 hibernate-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();
}
}