Error

[Java / Spring / JPA / Error] - LocalDateTime 에러

nam_ji 2024. 5. 22. 16:23

SpringBoot LocalDateTime 요청 에러

LocalDateTime 요청 형식 에러

1. 에러 내용

  • 개인 프로젝트 진행 중 날짜 데이터를 요청하면서 에러를 마주하게 되었습니다.
  • 에러
    2024-05-21T06:54:15.404+09:00  
    WARN 3156 --- [data-collection] [nio-8080-exec-6] 
    .w.s.m.s.DefaultHandlerExceptionResolver : Resolved 
    [org.springframework.http.converter.HttpMessageNotReadableException: 
    JSON parse error: Cannot deserialize value of type 
    `java.time.LocalDateTime` from String "2023-01-01 16:00:00": 
    Failed to deserialize java.time.LocalDateTime: 
    (java.time.format.DateTimeParseException) Text '2023-01-01 16:00:00' 
    could not be parsed at index 10]
     

2. 요청 방법

  • "recordedAt": "2023-01-01 16:00:00"  이렇게 요청하면서 생긴 에러입니다.

3. 원인

  • 10번째 index에서 파싱 실패라는 내용을 확인할 수 있습니다.
  • timestamp를 확인해보면 yyyy-MM-ddTHH:mm:ss 형태인 것을 확인할 수 있습니다.
  • 그렇기 때문에 요청 형식을 맞추면 해결할 수 있을거라 생각하고
    이렇게 요청하여 문제를 해결했습니다.

yyyy-MM-dd HH:mm:ss 형태로 요청

해결 방법

  1. 문제의 코드
    package com.namji.datacollection.dto.request;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    
    @Getter
    @AllArgsConstructor
    @NoArgsConstructor
    public class DataRequest {
      private String serialNumber;
      private int timeInterval;
      private String dataSet;
      private LocalDateTime recordedAt;
    }


    문제의 코드는 이렇게 구성되어 있습니다.
  2. 여기서 날짜 필드에 @JsonFormat을 추가하고 pattern을 입력해주면 됩니다.
    1. 수정 코드
      package com.namji.datacollection.dto.request;
      
      import com.fasterxml.jackson.annotation.JsonFormat;
      import java.time.LocalDate;
      import java.time.LocalDateTime;
      import lombok.AllArgsConstructor;
      import lombok.Getter;
      import lombok.NoArgsConstructor;
      
      @Getter
      @AllArgsConstructor
      @NoArgsConstructor
      public class DataRequest {
        private String serialNumber;
        private int timeInterval;
        private String dataSet;
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime recordedAt;
      }