문제 상황
•
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