You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级JDK17/SpringBoot3.3后LocalTime反序列化失败求助

解决Jackson反序列化"7:45PM"到LocalTime的大小写兼容问题

问题根源

升级到JDK17+后,Java的java.time格式化器默认启用严格模式,对AM/PM的大小写区分严格;而JDK11中,Jackson依赖的旧日期处理逻辑(类似SimpleDateFormat)对大小写不敏感,所以之前能正常解析"7:45PM",现在不行了。你用的h:mma模式默认期望小写的"pm"/"am",大写的"PM"就触发了格式错误。

可行解决方案

1. 给@JsonFormat添加宽松解析配置

直接在字段注解里开启宽松模式,就能忽略大小写差异:

public class RestrictionDTO {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "h:mma", lenient = OptBoolean.TRUE)
    private LocalTime time;
    // getter/setter
}

lenient = TRUE会让Jackson的解析器放宽格式校验,兼容大写的PM/AM。

2. 全局配置宽松的LocalTime反序列化器

如果多个地方都需要这种兼容,可以自定义反序列化器并注册到ObjectMapper:

// 自定义模块
SimpleModule timeModule = new SimpleModule();
// 创建支持宽松解析的格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mma")
        .withLocale(Locale.US)
        .withResolverStyle(ResolverStyle.LENIENT);
// 替换默认的LocalTime反序列化器
timeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(formatter));

// 注册到ObjectMapper
objectMapper.registerModule(timeModule);

全局生效后,所有LocalTime字段的解析都会支持大小写不敏感的AM/PM。

3. 修改格式模式兼容任意大小写

把模式改成h:mm[ap][mM],直接匹配任意大小写组合的时段标识:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "h:mm[ap][mM]")
private LocalTime time;

这个模式能匹配"pm"、"PM"、"Pm"、"pM"等所有大小写变体,不需要额外配置宽松模式。

测试验证

以上方案都不需要修改输入字符串"7:45PM",直接在JDK17+、SpringBoot3.3环境下就能正常解析。运行原有JUnit测试用例即可验证修复效果。

内容的提问来源于stack exchange,提问作者Arjun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:42:09