使用JSON通过Spring引导格式化Java时间
我想在SpringBootV1中实现一个自定义验证器。5.14.发布应用程序。首先,我创建一个自定义约束注释:
我有一个目标:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@SuperBuilder
public class Hotel {
@JsonFormat(pattern = "yyyy-MM-dd")
private OffsetDateTime interactionDurationStart;
@JsonFormat(pattern = "yyyy-MM-dd")
private OffsetDateTime interactionDurationEnd;
}
在yml中:
spring:
jackson:
mapper:
DEFAULT_VIEW_INCLUSION: true
serialization:
WRITE_DATES_AS_TIMESTAMPS: false
在我的配置文件中:
@Primary
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
//objectMapper.registerModule(new JavaTimeModule());
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
@Override
public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(offsetDateTime));
}
});
objectMapper.registerModule(simpleModule);
return objectMapper;
}
但这就是我在API响应中看到的
"interactionDurationEnd" : {
"offset" : {
"totalSeconds" : 7200,
"id" : "+02:00",
"rules" : {
"transitionRules" : [ ],
"transitions" : [ ],
"fixedOffset" : true
}
},
# 1 楼答案
这是因为spring使用的ObjectMapper默认只识别日期。如果要使用OffsetDateTime字段,需要注册一个序列化程序/反序列化程序来完成这项工作,请查看此Jackson date-format for OffsetDateTime in Spring Boot
如果您想将字段类型更改为Date,那么我不确定JsonFormat是否可以工作,因为我从未使用过它。我解决这个问题的方法是提供一个ObjectMapper bean,让spring使用
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"))
来实现这一点希望有帮助
# 2 楼答案
什么版本的杰克逊数据绑定
尝试添加形状
如果它能工作,那么你的问题是旧版本的jackson bind有一个bug,需要使用shape,或者默认情况下它会是any
# 3 楼答案
Spring MVC使用Jackson作为默认的json对象映射器<默认情况下,em>Jackson不支持java8的时间API的序列化/反序列化,但它提供了一个模块来集成它。只需在^{中包含此依赖项即可:
Spring Boot自动配置将检测Jackson模块类
JavaTimeModule
,并将其添加到ObjectMapper
实例中如果手动创建
ObjectMapper
实例,可以使用以下行添加模块: