ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • objectMapper로 map to object 변환시 timeformat 이슈 문제
    카테고리 없음 2021. 2. 25. 19:21

    java에서 obejctMapper를 사용하여 객체로 변환시

    타임 타입은 objectMapper에 적용된 해당 deserializer를 사용하여 변환한다.

     

    때문에 타임 포맷이 다른경우 해당 포멧을 serializer나 deserializer에 설정하여 타임 모듈에 등록하여 

    양 타입 변환에 사용한다.

     

    최근 생긴 이mysql db 데이터를 불러왔을때 타임 타입이 epoche time 값으로 넘어오는 이슈가 있었다.

    이런 경우에 와 같이 Deserializer를 생성하고

    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonToken;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
    
    import java.io.IOException;
    import java.time.Instant;
    import java.time.LocalDateTime;
    import java.time.ZoneOffset;
    import java.time.format.DateTimeFormatter;
    
    public class EpochLocalDateTimeDeserializer extends LocalDateTimeDeserializer {
    
        public EpochLocalDateTimeDeserializer() {
            super(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        }
    
        @Override
        public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException {
            if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
                long value = parser.getValueAsLong();
                Instant instant = Instant.ofEpochMilli(value);
                
                return LocalDateTime.ofInstant(instant, ZoneOffset.of("+09:00"));   //한국시간이므로 UTC +09:00 적용                      
            }
    
            return super.deserialize(parser, context);
        }
    
    }

    변환할 객체 클래스

    데이터 값에

     

    @JsonDeserialize(using = EpochLocalDateTimeDeserializer.class)
    private LocalDateTime dateTime;

     

    @JsonDeserialize 어노테이션을 통해 생성한 TimeDeserialize를 적용하면 된다.

     

     

    댓글

Designed by Tistory.