Spring Boot 2.2升级至3.0后,String转LocalDateTime查询参数反序列化失败
解决Spring Boot 3.0升级后LocalDateTime查询参数反序列化异常问题
问题原因
Spring Boot 3.0基于Spring Framework 6,该版本移除了对Joda-Time库的内置转换支持,全面转向Java 8+原生的java.time API。错误日志明确显示框架尝试将字符串转为org.joda.time.LocalDateTime但找不到对应转换器;另外你的@DateTimeFormat注解中使用了YYYY(代表周年,而非自然年),这也可能引发日期解析异常。
解决方案
1. 替换Joda-Time类型为Java原生API
将QueryParams类中的org.joda.time.LocalDateTime替换为java.time.LocalDateTime,同时注意Spring Boot 3.0使用Jakarta EE API,校验注解需同步替换:
import lombok.Data; import jakarta.validation.constraints.NotBlank; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; @Data public class QueryParams { @NotBlank @DateTimeFormat(pattern = "yyyyMMddHHmmss") private LocalDateTime from; @NotBlank @DateTimeFormat(pattern = "yyyyMMddHHmmss") private LocalDateTime to; }
2. 修正日期格式符
将YYYY改为yyyy:
YYYY:代表周年(基于周的年份,可能跨自然年)yyyy:代表自然年,匹配你的参数格式需求
3. 清理冗余依赖(可选)
如果项目不再使用Joda-Time,直接移除相关Maven/Gradle依赖,避免类冲突。
若必须保留Joda-Time(不推荐)
如果因历史原因无法替换Joda-Time,需手动注册字符串到org.joda.time.LocalDateTime的转换器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; import org.joda.time.LocalDateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; @Configuration public class JodaTimeConverterConfig { private static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyyMMddHHmmss"); @Bean public Converter<String, LocalDateTime> stringToJodaLocalDateTimeConverter() { return source -> LocalDateTime.parse(source, FORMATTER); } }
内容的提问来源于stack exchange,提问作者Vadim Vararu
相关产品推荐
相关产品推荐

