한 객체에 대해 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 |