升级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
相关产品推荐
相关产品推荐

