-
ObjectMapper LocalTime등 날짜시간 타입 매핑 실패 해결법Spring/Trouble Shooting 2024. 1. 13. 01:21
문제 상황
테스트 코드 작성중에
void createOperatingTime() throws Exception { //given AnimalHospital savedAnimalHospital = getSavedAnimalHospital(); List<HospitalOperationTimeCreateRequest> requests = new ArrayList<>(); for (DayOfWeekStatus value : DayOfWeekStatus.values()) { HospitalOperationTimeCreateRequest hospitalOperationTimeCreateRequest = HospitalOperationTimeCreateRequest.builder() .dayOfWeekStatus(value.name()) .startTime(LocalTime.of(11, 0)) .endTime(LocalTime.of(21, 0)) .isDayOff(false) .build(); requests.add(hospitalOperationTimeCreateRequest); } //when ResultActions resultActions = mockMvc.perform(post("/...", savedAnimalHospital.getId()) .contentType(MediaType.APPLICATION_JSON) .characterEncoding(StandardCharsets.UTF_8) .content(toJson(requests)) ); //then resultActions.andExpect(status().isNoContent()) .andDo(print()); }
임시로 운영 시간에 대한 테스트 코드를 작성중이였다.
mockMvc로 테스트를 진행하기 위해 요청 DTO를 Json으로 변한하는 과정에서 문제가 발생하였다.public record HospitalOperationTimeCreateRequest( @JsonProperty("day_of_week_status") String dayOfWeekStatus, @JsonProperty("start_time") LocalTime startTime, @JsonProperty("end_time") LocalTime endTime, @JsonProperty("is_day_off") Boolean isDayOff ) { @Builder public HospitalOperationTimeCreateRequest { } }
문제가 되는 DTO는 위와 같은 HospitalOperationTimeCreateRequest로 LocalTime을 Json으로 변환하지 못하는 경우였다.
public class TestUtils { private static final ObjectMapper mapper = new ObjectMapper(); public static String toJson(Object obj) { try { return mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { throw new IllegalStateException("[JsonUtils] -> toJson error\n"); } } }
기존 toJson() 메소드는 위와 같다. 단순한 데이터라면 문제 없이 수행이 되어야하는데 해당 타입들은 표준 Java 라이브러리 일부가 아니라 Java 8에 처음 도입된 JSR 310 날짜/시간 API의 일부이기 때문이라고 한다.
문제 해결 방법
public class TestUtils { private static final ObjectMapper mapper = new ObjectMapper(); public static String toJson(Object obj) { try { // 추가 mapper.registerModule(new JavaTimeModule()); return mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { throw new IllegalStateException("[JsonUtils] -> toJson error\n"); } } }
JavaTimeModule를 ObjectMapper의 빈으로 등록하여 테스트를 진행하여 해결하였다.