java - Spring Boot中的JSON Java 8 LocalDateTime格式

我在 Spring Boot应用程序中设置Java 8 LocalDateTime的格式有一个小问题, 对于'正常'的日期,我没有问题,但是,LocalDateTime字段转换为以下格式:


"startDate" : {


 "year" : 2010,


 "month" :"JANUARY",


 "dayOfMonth" : 1,


 "dayOfWeek" :"FRIDAY",


 "dayOfYear" : 1,


 "monthValue" : 1,


 "hour" : 2,


 "minute" : 2,


 "second" : 0,


 "nano" : 0,


 "chronology" : {


 "id" :"ISO",


 "calendarType" :"iso8601"


 }


 }



虽然我希望将其转换为类似的内容:


"startDate":"2015-01-01"



我的代码如下所示:


@JsonFormat(pattern="yyyy-MM-dd")


@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)


public LocalDateTime getStartDate() {


 return startDate;


}



但是,上述任何一个方法都不起作用,日期会像上面那样被格式化。欢迎建议 !

时间:

Spring Boot 2.x不再需要此配置, 我在这里写了更多的日期答案

(这是在Spring Boot 2之前执行此操作的方法.x,对于使用旧版Spring Boot的人员可能很有用),

我最终在这里找到了该怎么做, 要修复它,我需要另一个依赖项:


compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.0")



通过包括这种依赖关系.spring将自动为它启用转换器,如这里所描述的, 之后,需要将以下内容添加到application.properties:


spring.jackson.serialization.write_dates_as_timestamps=false



这将确保使用正确的转换器,日期将以 2016-03-16T13:56:39.492 格式打印,

只有在需要更改日期格式的情况下才需要Annotations.

我添加了com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.6.1 依赖项,我开始按以下格式获取日期:


"birthDate": [


 2016,


 1,


 25,


 21,


 34,


 55


 ]



我想要的不是我想要的而是更接近, 然后我添加了以下


spring.jackson.serialization.write_dates_as_timestamps=false



给application.properties文件提供了我所需要的正确格式,


"birthDate":"2016-01-25T21:34:55"



在Maven中,使用属性,这样你就可以在 Spring Boot升级之间生存,


<dependency>


 <groupId>com.fasterxml.jackson.datatype</groupId>


 <artifactId>jackson-datatype-jsr310</artifactId>


 <version>${jackson.version}</version>


</dependency>



1 )依赖项


 compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.8.8' 



2 )带有日期时间格式的Annotation,


public class RestObject {



 private LocalDateTime timestamp;



 @JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss")


 public LocalDateTime getTimestamp() {


 return timestamp;


 }


}



3 )spring配置,


@Configuration


public class JacksonConfig {



 @Bean


 @Primary


 public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {


 System.out.println("Config is starting.");


 ObjectMapper objectMapper = builder.createXmlMapper(false).build();


 objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);


 return objectMapper;


 }


}



我找到另一个解决方案,你可以将它转换为所需的任何格式,并且应用于所有LocalDateTime数据类型, 首先添加依赖项:


<dependency>


 <groupId>com.fasterxml.jackson.datatype</groupId>


 <artifactId>jackson-datatype-jsr310</artifactId>


</dependency>



添加以下 bean:


@Configuration


public class Java8DateTimeConfiguration {


 /**


 * Customizing


 * http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html


 *


 * Defining a @Bean of type Jackson2ObjectMapperBuilder will allow you to customize both default ObjectMapper and XmlMapper (used in MappingJackson2HttpMessageConverter and MappingJackson2XmlHttpMessageConverter respectively).


 */


 @Bean


 public Module jsonMapperJava8DateTimeModule() {


 val bean = new SimpleModule();



 bean.addDeserializer (ZonedDateTime.class, new JsonDeserializer<ZonedDateTime>() {


 @Override


 public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {


 return ZonedDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_ZONED_DATE_TIME);


 }


 });



 bean.addDeserializer(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {


 @Override


 public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {


 return LocalDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME);


 }


 });



 bean.addSerializer(ZonedDateTime.class, new JsonSerializer<ZonedDateTime>() {


 @Override


 public void serialize(


 ZonedDateTime zonedDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)


 throws IOException {


 jsonGenerator.writeString(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime));


 }


 });



 bean.addSerializer(LocalDateTime.class, new JsonSerializer<LocalDateTime>() {


 @Override


 public void serialize(


 LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)


 throws IOException {


 jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));


 }


 });



 return bean;


 }


}



在配置文件中添加以下内容:


@Import(Java8DateTimeConfiguration.class)



只要使用spring创建的objectMapper,就会序列化和序列化所有属性LocalDateTime和 ZonedDateTime 。

你为ZonedDateTime所获得的格式为: " 2017-12-27 T08:55:17.317 02:00[Asia/Jerusalem]"为 LocalDateTime: " 2017-12-27 T09:05:30.523"

这个工作的很好:

添加依赖项:


<dependency>


 <groupId>com.fasterxml.jackson.datatype</groupId>


 <artifactId>jackson-datatype-jdk8</artifactId>


</dependency>



添加annotation:


@JsonFormat(pattern="yyyy-MM-dd")



现在,你必须得到正确的格式。

要使用对象映射器,需要 register JavaTime,


ObjectMapper mapper = new ObjectMapper();


mapper.registerModule(new JavaTimeModule());



(我正在使用SpringBoot1.5.7和 Lombok 1.16.16 ),


@Data


public Class someClass {



 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)


 @JsonSerialize(using = LocalDateTimeSerializer.class)


 @JsonDeserialize(using = LocalDateTimeDeserializer.class)


 private LocalDateTime someDate;



}



如前所述,spring-boot将获取您需要的所有内容(适用于web和webflux启动程序)。

但是,更妙的是你不需要自己去做任何模块, 看一下这里的 , 由于@SpringBootApplication在幕后使用 @EnableAutoConfiguration,它意味着JacksonAutoConfiguration会自动添加到上下文中, 现在,如果你在JacksonAutoConfiguration内部查看,你将看到:


 private void configureModules(Jackson2ObjectMapperBuilder builder) {


 Collection<Module> moduleBeans = getBeans(this.applicationContext,


 Module.class);


 builder.modulesToInstall(moduleBeans.toArray(new Module[0]));


 }



将在初始化过程中被调用,并将获取,它可以在路径中找到的所有模块, (我使用 Spring Boot 2.1 )

@JsonDeserialize(using= LocalDateDeserializer.class) 不适用于下面的依赖项,


<dependency>


 <groupId>com.fasterxml.jackson.datatype</groupId>


 <artifactId>jackson-datatype-jsr310</artifactId>


 <version> 2.9.6</version>


</dependency>



我使用下面的代码转换器将日期反序列化为一个 java.sql.Date


import javax.persistence.AttributeConverter;


import javax.persistence.Converter;



@SuppressWarnings("UnusedDeclaration")


@Converter(autoApply = true)


public class LocalDateConverter implements AttributeConverter<java.time.LocalDate, java.sql.Date> {



 @Override


 public java.sql.Date convertToDatabaseColumn(java.time.LocalDate attribute) {



 return attribute == null? null : java.sql.Date.valueOf(attribute);


 }



 @Override


 public java.time.LocalDate convertToEntityAttribute(java.sql.Date dbData) {



 return dbData == null? null : dbData.toLocalDate();


 }


}



...