ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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의 빈으로 등록하여 테스트를 진행하여 해결하였다.

    댓글

Designed by black7375.