복붙노트

[SPRING] Spring Data JPA - json 직렬화를위한 ZonedDateTime 형식

SPRING

Spring Data JPA - json 직렬화를위한 ZonedDateTime 형식

ZonedDateTime의 json serialization에 문제가 있습니다. json으로 변환하면 거대한 객체가 생성되며 매번 데이터가 전송되는 것을 원하지 않습니다. 그래서 ISO 형식으로했는데 작동하지 않습니다. 어떻게 포맷 할 수 있습니까?

다음은 내 엔터티 클래스입니다.

@MappedSuperclass
public abstract class AuditBase {

    @Id
    @GeneratedValue
    private Long id;

    @CreatedDate
    private ZonedDateTime createdDate;

    @LastModifiedDate
    private ZonedDateTime lastModifiedDate;

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    public ZonedDateTime getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(ZonedDateTime lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    public ZonedDateTime getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(ZonedDateTime createdDate) {
        this.createdDate = createdDate;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @PrePersist
    public void prePersist() {
        this.createdDate = ZonedDateTime.now();
        this.lastModifiedDate = ZonedDateTime.now();
    }

    @PreUpdate
    public void preUpdate() {
        this.lastModifiedDate = ZonedDateTime.now();
    }
}

해결법

  1. ==============================

    1.Jackson이 json serialization을 위해 Jackson을 사용하고 있다고 가정합니다. Jackson은 이제 Java 8 새로운 날짜 시간 API 인 https://github.com/FasterXML/jackson-datatype-jsr310에 대한 모듈을 보유하고 있습니다.

    Jackson이 json serialization을 위해 Jackson을 사용하고 있다고 가정합니다. Jackson은 이제 Java 8 새로운 날짜 시간 API 인 https://github.com/FasterXML/jackson-datatype-jsr310에 대한 모듈을 보유하고 있습니다.

    이 의존성을 pom.xml에 추가하십시오.

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.6.0</version>
    </dependency>
    

    그리고 이것은 그것의 사용법입니다 :

     public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        System.out.println(objectMapper.writeValueAsString(new Entity()));
    }
    
    static class Entity {
        ZonedDateTime time = ZonedDateTime.now();
    
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
        public ZonedDateTime getTime() {
            return time;
        }
    }
    

    출력은 다음과 같습니다.

    {"time":"2015-07-25T23:09:01.795+0700"}
    

    참고 : Jackson 버전이 2.4.x 인 경우

    objectMapper.registerModule(new JSR310Module());
    

    희망이 도움이!

  2. ==============================

    2.위 답변은 작동하지만 기존 엔티티 클래스를 건드리지 않으려면 다음 설정이 ZonedDateTime에서 작동합니다.

    위 답변은 작동하지만 기존 엔티티 클래스를 건드리지 않으려면 다음 설정이 ZonedDateTime에서 작동합니다.

      public static ObjectMapper getMapper() {
        ObjectMapper mapper = new ObjectMapper(); 
        mapper.registerModule(new JavaTimeModule());    
        return mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
    .configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,false)
                            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false)
                            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
                            .setVisibility(mapper.getSerializationConfig()
                                    .getDefaultVisibilityChecker()
                                    .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                                    .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                                    .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                                    .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 
        }
    

    도서관:

    <dependency>
                <groupId>com.fasterxml.jackson.dataformat</groupId>
                <artifactId>jackson-dataformat-csv</artifactId>
                <version>${jackson.dataformat.csv.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.datatype</groupId>
                <artifactId>jackson-datatype-jsr310</artifactId>
            </dependency>
    
  3. from https://stackoverflow.com/questions/31627992/spring-data-jpa-zoneddatetime-format-for-json-serialization by cc-by-sa and MIT license