specification repositoryrestresource examples ejemplo data java json spring jpa spring-jpa

java - repositoryrestresource - spring data jpa specification examples



Spring Data JPA-Formato ZonedDateTime para la serialización json (2)

Tengo un problema con la serialización json de ZonedDateTime . Cuando se convierte en json produce un objeto enorme y no quiero que se transfieran todos los datos. Así que traté de formatearlo en ISO, pero no funciona. ¿Cómo puedo obtener el formato?

Aquí está mi Clase de Entidad:

@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(); } }


Supongo que estás usando Jackson para la serialización json, Jackson ahora tiene un módulo para Java 8 nueva API de fecha y hora, https://github.com/FasterXML/jackson-datatype-jsr310 .

Agregue esta dependencia a su pom.xml

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

Y este es su uso:

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; } }

El resultado es:

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

Nota: si su versión de Jackson es 2.4.x uso

objectMapper.registerModule(new JSR310Module());

¡Espero que esto ayude!


La respuesta anterior funciona, pero si no desea tocar su clase de entidad existente, las siguientes configuraciones funcionarán con 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)); }

Biblioteca:

<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>