Search
Duplicate
🔫

커스텀한 Jackson ObjectMapper를 Bean으로 등록했을 때 기존 Spring Security를 통한 인증 객체 Deserialization이 되지 않는 문제

분야
BE
주제
BE
Spring
심각도
낮음🤒
제보자
담당자
작성자
상태
처리 완료
이슈링크(optional)
작성일자
2023/12/10 05:59
공개여부
공개
글감

문제 상황

Dev에서 잘 돌아가는 테스트가, Alarm 관련 브랜치에서 돌아가지 않는 것을 확인.
// 초략... Cannot construct instance of org.johoeunsae.exchangediary.auth.oauth2.vo.Oauth2LoginRequestVO (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Java
복사
인증한 데이터에 대해서 Spring Security에서 내려주는 객체(Oauth2LoginRequestVO)가 역직렬화(Deserialization)되지 않는 것으로 에러를 확인했음.
→ 기존 브랜치와 현재 브랜치에서 역직렬화와 관련한 부분은 Controller에서 LocalDateTime 타입과 관련한 역/직렬화 문제를 해결하기 위해 새로이 시간 모듈을 register하여 ObjectMapper를 Bean으로 등록하도록 한 구성파일 밖에 없었음.

원인

해당 문제의 원인으로 추측되어서 Bean으로 등록하지 않고 테스트를 했을 때 테스트가 정상적으로 작동함을 확인함.
@Configuration public class JacksonConfig { @Bean public ObjectMapper jacksonObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE); javaTimeModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); objectMapper.registerModule(javaTimeModule); return objectMapper; } }
Java
복사

해결

기본적으로 Spring Security에서 register하는 ObjectMapper가 있을 것으로 생각하여, 기존의 커스텀 jacksonObjectMapper를 최대한 후순위에서 register하도록 변경하고자 함. (LocalDateTime과 유저 로그인 객체 둘 다 챙겨야하기 때문)
아래와 같이 코드 변경
@Configuration @RequiredArgsConstructor public class JacksonConfig { private final ObjectMapper objectMapper; @PostConstruct public void postConstruct() { JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE); javaTimeModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); objectMapper.registerModule(javaTimeModule); } }
Java
복사
@PostConstruct를 통해 기존에 이미 있는 Spring Security에서 이미 설정한 ObjectMapper를 주입 받고, 후순위로 모듈을 추가하여 register, Bean 등록이 되도록 설정하였다.
@PostConstruct는 주로 의존성 주입이 이루어진 후에 초기화를 수행할 필요가 있는 경우에 사용되는 annotation이다.
테스트가 정상 작동함을 확인할 수 있다!

참고자료

GPT