개발서버를 셋팅하는 와중에
톰캣 실행시 이런 오류가 떠버림
Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
이것이 무엇인고.....하고 찾아봤다.
오류 원인
- 프로젝트에 Bean Validation 구현체(Hibernate Validator 등)가 누락됨
- Maven 또는 Gradle에서 의존성이 추가되지 않음
- 클래스 경로(classpath)에 Bean Validation Provider가 로드되지 않음
해결 방법
1. Hibernate Validator 라이브러리 추가
Maven 프로젝트
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.5.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>
Gradle 프로젝트
implementation 'org.hibernate.validator:hibernate-validator:6.2.5.Final'
implementation 'org.glassfish:javax.el:3.0.0'
2. 클래스 경로 확인
- 의존성을 추가한 뒤, 빌드 명령을 실행하여 라이브러리가 다운로드되었는지 확인
- Maven:
mvn clean install
Gradle:gradle build
3. Spring 설정 확인
Spring에서 LocalValidatorFactoryBean이 제대로 등록되었는지 확인
Java Config
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class AppConfig {
@Bean
public LocalValidatorFactoryBean validatorFactory() {
return new LocalValidatorFactoryBean();
}
}
XML Config
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
4. 의존성 충돌 방지
Java EE API가 포함된 경우 충돌을 방지하기 위해 적절한 버전을 추가하거나 제외
Maven
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
<scope>provided</scope>
</dependency>
Gradle
implementation 'javax.validation:validation-api:2.0.1.Final'
예제 코드
유효성 검사 클래스
import javax.validation.constraints.NotNull;
public class User {
@NotNull(message = "이름은 필수.")
private String name;
// Getters and Setters
}
Spring 컨트롤러
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@Validated
public class UserController {
@PostMapping("/user")
public String createUser(@RequestBody @Valid User user) {
return "User created: " + user.getName();
}
}
요약
- Hibernate Validator 의존성을 추가
- 필요 시 Spring에서 LocalValidatorFactoryBean을 명시적으로 등록
- 애플리케이션을 재구동하여 오류가 해결되었는지 확인
하지만 저거 무시하고 그냥 해봤는데.... 실행이 되더라...
오류를 무시해도 별로 찜찜하지않다면 그냥 두고 해도 될듯하다!