2024. 2. 14. 14:35ㆍ팁 모음 장소
강의를 듣다가 Hibernate5Module로 null인 객체가 있을 때 무시하고 작동할 수 있게 설정을 해놨다. 그런데 분명히 제대로 원하는 객체를 반환했는데, Dispatcher Servlet에서 ClassNoFoundException이 뜨는 것이다.
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
[Handler dispatch failed: java.lang.NoClassDefFoundError: javax/persistence/Transient] with
root cause
처음엔 이런 에러가 떠서 빌드에서 파일을 막 바꾸고 restarted 적용한게 문제인가 싶어서 빌드 클린도 해보고 껐다 켜보기도 했는데 작동이 안됐다. 그래서 이걸 보니까 Dispatcher Servlet까지 넘어갔다는건 Controller 상에서 문제가 발생한게 아니라 중간에 메시지 컨버터 부분에서 Json으로 바꿔주는 부분에서 문제가 생겼다는 것 같았다. 그 다음에 보이는 에러에서 냄새가 나는 문구는 아래였다.
noclassdeffounderror javax/persistence/transient
분명히 난 Spring 3.X라서 jakarta를 써야되는데 javax 어쩌고 저쩌고 하는 코드를 보니 뭔가 아니다 싶었다. 그래서 뭐 강의 코드 복붙한게 없는데 저걸 임포트할 수가 있나? 싶어서 저게 validation 관련 부분으로 쓰는 파일이 persistence랑 관련이 있으니 Entity 파일을 전부 다 봤는데 jakarta로 잘 돼있었다.
우연히 검색하던 도중 Hibernate5Module을 사용했기 때문임을 알 수 있었고 문제를 해결할 수 있었다.
[ 해결 방법 ]
build.gradle에 가서 Spring 버전에 맞는 의존 관계를 설정해주고 메인 어플리케이션이 돌아가는 @SpringBootApplication에 다음과 같이 빈을 하나 등록해주자.
Spring 3.0 버전 이상 용
Build.gradle 추가 코드
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5-jakarta'
빈 등록 코드
@Bean
Hibernate5JakartaModule hibernate5JakartaModule(){
return new Hibernate5JakartaModule();
}
Spring 2.0 버전 이상, 3.0미만 용
Build.gradle 추가 코드
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
빈 등록 코드
@Bean
Hibernate5Module hibernate5Module(){
return new Hibernate5Module();
}
[ 느낀 점 ]
처음에 강의 들으면서 돌리면서 볼 걸 귀찮아서 오타만 확인하고 작동을 안 시켜본 업보가 크게 돌아온 것 같다. 다음엔 잘 봐야겠다.
'팁 모음 장소' 카테고리의 다른 글
JPA 프로그래밍 - LazyInitializationException (1) | 2024.02.18 |
---|---|
스프링 부트 3.x - queryDSL gradle 설정 방법 (0) | 2024.02.14 |
H2 DB 사용 방법 (0) | 2024.01.22 |
인텔리제이 한글 깨짐 (0) | 2024.01.19 |
인텔리제이 - 디버거 사용하기 1 (2) | 2023.12.28 |