-
날짜 시간 데이터 요청/응답 - ZonedDateTimeProject Trouble Shooting/[Sleeper] 수면관리 어플리케이션 2022. 12. 29. 23:14728x90
이번 프로젝트에서는 날짜 시간 데이터를 많이 다루고 있습니다.
저저번 포스팅과 마찬가지로, Postman을 이용하여서 요청을 받다가 아래와 같은 에러가 발생하였습니다.
현재 상황
@Getter @RequiredArgsConstructor @Builder public class SetTimeRequestForm { @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private final ZonedDateTime setSleepTime; @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private final ZonedDateTime setWakeTime; public static Sleep toEntity(ZonedDateTime setSleepTime, ZonedDateTime setWakeTime){ return Sleep.builder() .setSleepTime(setSleepTime) .setWakeTime(setWakeTime) .build(); } }
SetTimeRequestForm이라는 dto로 요청을 받아서 각각 setSleepTIme과 setWakeTime으로 바인딩될 예정입니다.
문제 발생
"Failed to convert value of type 'java.lang.String' to required type 'java.time.ZonedDateTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.time.ZonedDateTime] for value '2022-12-29T09:34:35'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2022-12-29T09:34:35]"
그러나 바인딩이 위와 같은 에러로 인해 잘 되지 않았습니다.
문제 분석
오류메세지에서 나온 듯이 String 타입에서 ZonedDateTime으로 형변환을 실패한 것이다.
문제 해결
해결 방안의 열쇠는 어떻게 형변환을 할 것이다.
첫 번째 해결 방법은 요청을 LocalDateTime으로 요청을 받은 다음에, ZoneDateTime으로 zoneId를 사용해서 변환하는 것이다.
public class SetTimeRequestForm { @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private final LocalDateTime setSleepTime; @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private final LocalDateTime setWakeTime; }
public static ZonedDateTime convertToZoneDateTime(LocalDateTime localDateTime){ ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Seoul")); return zonedDateTime; }
두 번째 해결 방법은 String으로 요청을 받은 다음에, ZoneDateTime으로 변환을 하는 것이다.
public class ZonedDateTimeConverter implements Converter<String, ZonedDateTime> { private final DateTimeFormatter formatter; public ZonedDateTimeConverter(ZoneId zoneId) { this.formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(zoneId); } @Override public ZonedDateTime convert(String source) { return ZonedDateTime.parse(source, this.formatter); } }
이상입니다~~!!
728x90'Project Trouble Shooting > [Sleeper] 수면관리 어플리케이션' 카테고리의 다른 글