java

com.fasterxml.jackson.databind.exc.InvalidDefinitionException

Chris.Ko 2023. 1. 6. 22:44

한 객체에 대해 findById(~) 한 것 뿐인데 ....

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: so.x.web.todo.dtos.Todo$HibernateProxy$JINl8jdc["hibernateLazyInitializer"]) ...........

이런 에러가 뚝 나왔다..

 

해결 방법으로는 

1. application.properties에서  spring.jackson.serialization.fail-on-empty-beans=false  만 추가해주면 된다.

2. 오류가 나는 엔티티의 LAZY 설정을 EAGER로 바꿔주면 된다.

3. 오류가 나는 컬럼에 @JsonIgnore를 설정해주면 된다. (@JsonIgnore : 파싱 자체를 제외하는 방법)

 

2번과 3번의 경우에 아주 아주 간단한 프로젝트가 아닌 경우라면 프로젝트 전체에 영향을 아주 심각하게 줄 수 있다고 판단해서 1번 해결 방법으로 해결하였다.

 

이제 분석에 들어가보자!!

에러가 난 이유를 생각해 보자면 Todo DAO에는 TodoMember 라거나  TodoSubInfo 등이 @OneToMany, @ManyToOne, @OneToOne 으로 Join 되어 있다. 모두 fetch 조건이 fetch.LAZY 이다.

* (LAZY 옵션은 필요할때 조회를 해오는 옵션이다.)

필요가 없는 테이블에 대해서 조회를 하지 않았기 때문에 비어있는 클래스에 대해 serializer 하려고 해서 발생한 문제인 것 같다.

* (Serializer : 직렬화 / 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술)

 

'java' 카테고리의 다른 글

기본 정리  (0) 2023.01.14
JVM  (0) 2023.01.06
<? super T> 와 <? extends T>의 차이는 무엇인가?  (0) 2021.07.06