스프링 부트 javax.validation을 올바르게 주입하는 방법검증자
주사하는 데 문제가 있어요Validator
JSR-303(hibernate-validator)을 사용하여 모델을 검증하려고 할 때 스프링 어플리케이션 bean으로 들어갑니다.
주요 구성 클래스는 다음과 같습니다.
@EnableAutoConfiguration
@EnableWebMvc // <---
@EnableJpaRepositories("com.example")
@EntityScan("com.example")
public class MainConfiguration {
javadocs에 따르면:
/**
* Provide a custom {@link Validator} instead of the one created by default.
* The default implementation, assuming JSR-303 is on the classpath, is:
* {@link org.springframework.validation.beanvalidation.LocalValidatorFactoryBean}.
* Leave the return value as {@code null} to keep the default.
*/
Validator getValidator();
hibernate-validator는 클래스 패스에 있습니다.Repository에 삽입하려고 합니다.
@Repository
public class UserRepositoryImpl implements UserRepositoryCustom {
@Autowired
private Validator validator;
예외 발생:
No qualifying bean of type [javax.validation.Validator] found for dependency:
갱신:
이에 대한 부분적인 회피책은 메인컨피규레이션클래스에서 이를 정의하는 것입니다.
@Bean
public Validator validator() {
return new org.springframework.validation.beanvalidation.LocalValidatorFactoryBean();
}
그러나 통합 테스트(필요한 테스트)org.springframework.test.context.web.WebAppConfiguration;
주석 및 검증 로직 사용)이 실패합니다.
유형별 빈을 선언해야 합니다.LocalValidatorFactoryBean
다음과 같습니다.
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
XML 또는
@Bean
public javax.validation.Validator localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
[ Java Config ]으로 설정합니다.
편집:
JPA가 사용되고 있고, 휴지 상태에 있는 경우, 휴지 상태에 있는 경우는, Spring Framework 뿐만이 아니라, 콩의 유효성을 자동적으로 검증하려고 합니다.이로 인해 문제가 발생할 수 있습니다.javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator
왜냐하면 Hibernate는 Spring Context를 모르기 때문에 LocalValidatorFactoryBean에서도 알 수 없습니다.그러면 검증자가 두 번 실행됩니다.하나는 맞지만, 실패하면요
디폴트의 휴지 상태 ORM 검증을 무효로 하려면 , 다음의 스프링 속성을 설정할 필요가 있습니다.
spring.jpa.properties.javax.persistence.validation.mode=none
이 예제를 업데이트했습니다.왜냐하면 Validator가 주입되지 않았다는 것을 반복해서 발견했기 때문입니다.그리고 이것이 제가 직면한 문제였습니다.
스프링 문서의 이 부분에는 모든 세부 정보가 포함되어 있습니다.
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {LocalValidatorFactoryBean.class, ...})
@SpringBootTest
public class TestClass{
@Autowired
private Validator validator;
@Test
public void testValidator(){
...logic...
validator.validate(...);
}
}
최근 이 문제가 발생(2023년 9월 26일).제 목표는 일부 POJO에 있는 검증 주석을 테스트하는 단위 테스트를 만드는 것이었습니다.검증에는 커스텀 제약조건 검증 주석 및 javax.validation 주석 사용이 포함됩니다.제 목표는 실제로 다양한 입력에 대해 몇 가지 검증 테스트를 실행하는 것이었기 때문에 이러한 검증 클래스가 조롱되는 것을 원치 않았습니다.사실 테스트 상황에서 그것들이 필요했어요.기본적으로는 Spring은 컴포넌트 스캔이 실행되고 애플리케이션 컨텍스트가 해결되는 일반적인 애플리케이션 부팅 프로세스를 실행하지 않습니다.@SpringBoot을 포함할 수 있습니다.해당 프로세스를 수행하려면 주석 테스트를 수행하십시오.그러나 이 작업은 기본적으로 전체 애플리케이션을 시작하는 것이기 때문에 극히 일부만 수행해야 합니다. 제 사용 사례에서는 이 작업이 필요하지 않았습니다.저희 회사에서 사용하는 래퍼와 베이스 클래스가 있다는 점에서 제 상황은 조금 특별합니다.그 중 하나는 스프링 검증기 인터페이스를 구현하고 검증기 인터페이스를 자동 배선합니다.이는 클래스가 자신의 오버라이드된 검증 메서드로 ValidationUtils.invoke(검증자, 타깃, 오류)를 호출하기 때문에 문제가 있었습니다만, 컨텍스트에 존재하는 검증자 인터페이스의 유일한 구현이었기 때문에 호출 시 기본 검증자여야 할 것이 그 자체에 매핑되어 스택오버플로우 예외가 발생합니다.기본 래퍼 클래스의 유효성 검사 메서드입니다.운영 환경에서 검증자에 대한 자동 배선 종속성은 기본 구현인 LocalValidatorFactoryBean으로 해결됩니다.즉, 이것은 컨텍스트에 추가되어야 합니다.ContextConfiguration 주석 및 SpringBoot 사용 시테스트 주석입니다. 응용 프로그램 컨텍스트에 추가할 클래스를 지정합니다.테스트 클래스에서도 정적 Test Configuration 블록을 사용하여 이 테스트를 시도했지만 문제가 올바르게 해결되지 않았습니다.이것은 다른 솔루션이 나타내는 것입니다.
언급URL : https://stackoverflow.com/questions/23604540/spring-boot-how-to-properly-inject-javax-validation-validator
'programing' 카테고리의 다른 글
Jackson을 사용하여 맵을 JSON으로 변환 (0) | 2023.02.23 |
---|---|
각도에서의 DOM 조작 처리JS (0) | 2023.02.23 |
JsonParser는 더 이상 사용되지 않습니다. (0) | 2023.02.23 |
여러 인라인 스타일 개체를 결합하려면 어떻게 해야 합니까? (0) | 2023.02.23 |
Jackson JSON Marshall은 getter를 무시합니다. (0) | 2023.02.23 |