[Spring Boot] java.lang.NoClassDefFoundError: javax/validation/ClockProvider

Loopy·2022년 2월 13일
0

삽질기록

목록 보기
4/28
post-thumbnail
post-custom-banner

☁️ 에러 내용

MSA 공부를 하던중, user-service에서 다음과 같은 에러가 났다.

org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException:

맨 위에 위치한 entityMangerFactory 를 생성하지 못했다는 에러에 꽃혀서 1시간 동안 삽질을 하였다. 그러다 맨 아래에 있는 더 자세한 에러를 보고, 구글링을 해보니 바로 해결 방안을 찾을 수 있었다.

Caused by: java.lang.NoClassDefFoundError: javax/validation/ClockProvider
	at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:135) ~[hibernate-validator-6.0.17.Final.jar:6.0.17.Final]
	at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:108) ~[hibernate-validator-6.0.17.Final.jar:6.0.17.Final]
	at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33) ~[hibernate-validator-6.0.17.Final.jar:6.0.17.Final]
	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]
	at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110) ~[validation-api-1.1.0.Final.jar:na]
	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:501) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.activate(TypeSafeActivator.java:83) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:137) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
	... 31 common frames omitted

☁️ 원인과 해결 방안

👉stack overflow를 찾아보니, 문제의 원인은 javax.validationhibernate-validator의 버전이 맞지 않았던 것이였다.(아래 사진은 현재 추가한 dependency)

하이버네이트 공식 문서에 가보니, 6.0.17.Final 버전은 Jakarta Bean validation 2.0 에 포함되어 있다고 한다.

💡Bean Validation이란?
Bean Validation은 JavaBean 유효성 검증을 위한 메타데이터 모델과 API에 대한 정의이며 여기서 언급하고 있는 JavaBean은 직렬화 가능하고 매개변수가 없는 생성자를 가지며, Getter 와 Setter Method를 사용하여 프로퍼티에 접근이 가능한 객체를 의미한다.

그렇다면 둘의 관계가 어떻게 되는 것일까?

validation을 위해 Java에서는 Jakarta Bean Validation라는 Specification을 이용할 수 있다. Annotation 을 이용해서 Validation을 처리할 수 있는 방법인데, 이 Specification을 구현한 모듈이 Hibernate Validator이다.

공식 문서에 따르면 Jakarta Bean ValidationBean Validation의 차이는 별로 없다 한다. 따라서 아래처럼 버전을 2.0 이상으로 올리니, 에러가 해결되었다.

 <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>


Reference

https://medium.com/@SlackBeck/javabean-validation%EA%B3%BC-hibernate-validator-%EA%B7%B8%EB%A6%AC%EA%B3%A0-spring-boot-3f31aee610f5

https://kapentaz.github.io/java/Java-Bean-Validation-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90/#

profile
개인용으로 공부하는 공간입니다. 잘못된 부분은 피드백 부탁드립니다!
post-custom-banner

0개의 댓글