Spring 启动 LocalDate 字段序列化和反序列化
Spring Boot LocalDate field serialization and deserialization
在 Spring Boot 1.2.3.RELEASE 中使用 fasterxml 将 LocalDate
字段序列化和反序列化为 ISO 日期格式字符串的正确方法是什么?
我试过:
spring.jackson.serialization.write-dates-as-timestamps:false
在 application.properties 文件中,
在项目中包含jackson-datatype-jsr310然后使用
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
注释
和@DateTimeFormat(iso=ISO.DATE)
注解,
添加 Jsr310DateTimeFormatAnnotationFormatterFactory
作为格式化程序:
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldAnnotation(new Jsr310DateTimeFormatAnnotationFormatterFactory());
}
以上 None 有帮助。
compile ("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
在build.gradle
然后以下注释有帮助:
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthday;
更新:如果您使用的是 Spring Boot 2.*,则已通过 "starters".
之一包含依赖项
如果您想使用自定义 Java 日期格式化程序,请添加 @JsonFormat
注释。
@JsonFormat(pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthdate;*
实际上,如果您只在 pom.xml 中指定依赖项,它就可以工作。
有了这个,我所有的 LocalDate 字段都自动使用 ISO 格式,不需要注释它们:
<!-- This is enough for LocalDate to be deserialized using ISO format -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
在 Spring Boot 1.5.7 上测试。
在我的 Spring Boot 2 应用程序中
@JsonFormat
注释在(反)序列化 JSON 数据时用于 REST 控制器。
@DateTimeFormat
注解在其他控制器 ModelAttribute
s 中(反)序列化字符串数据时使用。
您可以在同一字段上同时指定两者(如果您在 JSON 和 Thymeleaf 模板之间共享 DTO 则很有用):
@JsonFormat(pattern = "dd/MM/yyyy")
@DateTimeFormat(pattern = "dd/MM/yyyy")
private LocalDate birthdate;
Gradle依赖性:
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-json'
我希望这是在 Spring 启动 2.x 应用程序中自定义 Date/Time 格式所需的全部配置。
对于 Spring 启动 1.x 应用程序,指定额外的注释和依赖项:
@JsonFormat(pattern = "dd/MM/yyyy")
@DateTimeFormat(pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthDate;
// or
@JsonFormat(pattern = "dd/MM/yyyy HH:mm")
@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime birthDateTime;
implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.8'
请注意,如果有人以错误的格式发送日期,您的 API 将抛出“JSON 解析错误”。映射示例:
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate releaseDate;
异常示例:
HttpMessageNotReadableException
: JSON parse error: Cannot deserialize value of type java.time.LocalDate
from String "2002": Failed to deserialize java.time.LocalDate
: (java.time.format.DateTimeParseException
) Text '2002' could not be parsed at index 4; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException
: Cannot deserialize value of type java.time.LocalDate
from String "2002": Failed to deserialize java.time.LocalDate
: (java.time.format.DateTimeParseException
) Text '2002' could not be parsed at index 4
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
DateTimeFormatter localDateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
builder.serializerByType(LocalDate.class, new LocalDateSerializer(localDateFormatter));
builder.deserializerByType(LocalDate.class, new LocalDateDeserializer(localDateFormatter));
DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter));
builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter));
};
}
在 Spring Boot 1.2.3.RELEASE 中使用 fasterxml 将 LocalDate
字段序列化和反序列化为 ISO 日期格式字符串的正确方法是什么?
我试过:
spring.jackson.serialization.write-dates-as-timestamps:false
在 application.properties 文件中,在项目中包含jackson-datatype-jsr310然后使用
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
注释和
@DateTimeFormat(iso=ISO.DATE)
注解,
添加
Jsr310DateTimeFormatAnnotationFormatterFactory
作为格式化程序:@Override public void addFormatters(FormatterRegistry registry) { registry.addFormatterForFieldAnnotation(new Jsr310DateTimeFormatAnnotationFormatterFactory()); }
None 有帮助。
compile ("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
在build.gradle 然后以下注释有帮助:
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthday;
更新:如果您使用的是 Spring Boot 2.*,则已通过 "starters".
之一包含依赖项如果您想使用自定义 Java 日期格式化程序,请添加 @JsonFormat
注释。
@JsonFormat(pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthdate;*
实际上,如果您只在 pom.xml 中指定依赖项,它就可以工作。
有了这个,我所有的 LocalDate 字段都自动使用 ISO 格式,不需要注释它们:
<!-- This is enough for LocalDate to be deserialized using ISO format -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
在 Spring Boot 1.5.7 上测试。
在我的 Spring Boot 2 应用程序中
@JsonFormat
注释在(反)序列化 JSON 数据时用于 REST 控制器。@DateTimeFormat
注解在其他控制器ModelAttribute
s 中(反)序列化字符串数据时使用。
您可以在同一字段上同时指定两者(如果您在 JSON 和 Thymeleaf 模板之间共享 DTO 则很有用):
@JsonFormat(pattern = "dd/MM/yyyy")
@DateTimeFormat(pattern = "dd/MM/yyyy")
private LocalDate birthdate;
Gradle依赖性:
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-json'
我希望这是在 Spring 启动 2.x 应用程序中自定义 Date/Time 格式所需的全部配置。
对于 Spring 启动 1.x 应用程序,指定额外的注释和依赖项:
@JsonFormat(pattern = "dd/MM/yyyy")
@DateTimeFormat(pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthDate;
// or
@JsonFormat(pattern = "dd/MM/yyyy HH:mm")
@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime birthDateTime;
implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.8'
请注意,如果有人以错误的格式发送日期,您的 API 将抛出“JSON 解析错误”。映射示例:
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate releaseDate;
异常示例:
HttpMessageNotReadableException
: JSON parse error: Cannot deserialize value of typejava.time.LocalDate
from String "2002": Failed to deserializejava.time.LocalDate
: (java.time.format.DateTimeParseException
) Text '2002' could not be parsed at index 4; nested exception iscom.fasterxml.jackson.databind.exc.InvalidFormatException
: Cannot deserialize value of typejava.time.LocalDate
from String "2002": Failed to deserializejava.time.LocalDate
: (java.time.format.DateTimeParseException
) Text '2002' could not be parsed at index 4
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
DateTimeFormatter localDateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
builder.serializerByType(LocalDate.class, new LocalDateSerializer(localDateFormatter));
builder.deserializerByType(LocalDate.class, new LocalDateDeserializer(localDateFormatter));
DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter));
builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter));
};
}