gpt4 book ai didi

java - 是否有 Spring Boot 标志来禁用宽松的 Jackson 对 LocalDate 值的时间解析?

转载 作者:行者123 更新时间:2023-12-04 13:07:59 26 4
gpt4 key购买 nike

Spring Boot 默认值允许 LocalDate 中的日期和日期时间值.
例如。对于以下 DTO:

public class Person {

private LocalDate birthDate;

//getter & setters
}
以下两种情况都是可以接受的:
{
"birthDate" : "2021-07-24"
}
{
"birthDate" : "2021-07-24T17:00:00Z"
}
jackson 有一个 lenient可以设置为拒绝带有时间的日期的标志:
@JsonFormat(pattern="uuuu-MM-dd", lenient = OptBoolean.FALSE)
private LocalDate birthDate;
是否有相应的 Spring Boot 应用程序属性标志可以设置为全局应用于所有 LocalDate字段,以便注释不需要添加到每个 LocalDate字段,而无需定义像 this 这样的自定义解串器?

最佳答案

Spring Boot 2.5.x(或更早版本)和 Jackson 2.12.x(或更早版本)
在撰写本文时,Spring Boot 和 Jackson 的当前版本分别为 2.5.3 和 2.12.4。
在此版本的 Spring Boot 中,没有可用于配置 Jackson 宽大处理的 Spring Boot 应用程序属性。
即使有办法在 Spring Boot 中配置 Jackson 宽大处理,设置 lenient标志到 false根据你的例子,实际上并没有导致 jackson 拒绝时间部分。相反,它实际上是 pattern 的存在。您示例中的元素导致该值被拒绝。因此,这足以拒绝日期时间值:

@JsonFormat(pattern="uuuu-MM-dd")
private LocalDate birthDate;
话虽如此,可以在 ObjectMapper 中配置默认​​的宽大设置。使用 ObjectMapper.setDefaultLeniency(Boolean b) .它只是不会达到预期的结果,因为它不会导致在 Jackson 2.12.x 或更早版本中拒绝带有时间的日期。
Spring Boot 2.6.0 和 Jackson 2.13.0
使用 Spring Boot 2.6.0 和 Jackson 2.13.0(在撰写本文时都没有发布), spring.jackson.default-leniency应用程序属性可以设置为 false以达到预期的效果。
spring.jackson.default-leniency: false
Jackson 2.13.0 正在改变 lenient 的行为标记,以便日期时间值在为 false 时被拒绝( jackson-modules-java8#212 )。
Spring Boot 2.6.0 正在添加 spring.jackson.default-leniency用于在提供的 Spring Boot 上配置默认宽大的标志 ObjectMapper bean ( spring-boot#27547 )。
因此,结合这两个库版本,并利用 spring.jackson.default-leniency flag 实现了拒绝带有时间分量的日期的预期结果 LocalDate值。
Spring Boot 2.5.x(或更早版本)和 Jackson 2.13.0
如前所述,Spring Boot 2.5.x 没有设置 Spring Boot 提供的默认宽大的应用程序属性 ObjectMapper bean 角,扁 bean 。但是,可以通过其他方式自定义此 bean 以设置默认宽大。如上所述,这将实现在 Jackson 2.13.x 或更高版本中拒绝带有时间的日期的预期结果。
在 Spring Boot 2.5.x 应用程序中设置默认宽大的最直接方法可能是使用自定义 Jackson2ObjectMapperBuilderCustomizer bean 来配置 ObjectMapper :
@Configuration
public class CustomizedJacksonConfiguration {
@Bean
public Jackson2ObjectMapperBuilderCustomizer nonLenientObjectMapperBuilderCustomizer() {
return builder -> builder.postConfigurer(
objectMapper -> objectMapper.setDefaultLeniency(false));
}
}

关于java - 是否有 Spring Boot 标志来禁用宽松的 Jackson 对 LocalDate 值的时间解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68513802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com