날짜 시간 데이터 요청/응답 - ZonedDateTime
2022. 12. 29. 23:14ㆍ프로젝트/[Sleeper] 수면관리 어플리케이션
728x90
이번 프로젝트에서는 날짜 시간 데이터를 많이 다루고 있습니다.
저저번 포스팅과 마찬가지로, 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