[SPRING] Spring Data JPA - json 직렬화를위한 ZonedDateTime 형식
SPRINGSpring 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.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.위 답변은 작동하지만 기존 엔티티 클래스를 건드리지 않으려면 다음 설정이 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>
from https://stackoverflow.com/questions/31627992/spring-data-jpa-zoneddatetime-format-for-json-serialization by cc-by-sa and MIT license