添加jackson-datatype-jsr310模块后仍报错:Java 8时间类型不支持
问题解决思路
1. 统一Jackson组件版本
你当前使用的jackson-databind:2.12.3和jackson-datatype-jsr310:2.15.2版本不一致,这会导致模块兼容性问题——Jackson核心模块与扩展模块的版本必须严格匹配才能正常协作。
解决方式:将两个组件版本统一,比如都升级到2.15.2,或者都降级到2.12.3。以Maven为例,在pom.xml中统一管理版本:
<properties> <jackson.version>2.15.2</jackson.version> </properties> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>${jackson.version}</version> </dependency> </dependencies>
2. 确保Spring使用你的自定义ObjectMapper
Spring 3.x中,直接注册ObjectMapper Bean可能不会覆盖默认配置,需要通过以下方式让Spring优先使用你的自定义实例:
方式一:用Jackson2ObjectMapperBuilderCustomizer(推荐,贴合Spring自动配置逻辑)
package org.something.config; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.DurationSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.temporal.ChronoUnit; @Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { return builder -> { // 注册JSR310模块 builder.modules(new JavaTimeModule()); // 显式配置Duration的序列化/反序列化规则(可根据需求调整格式) builder.serializerByType(Duration.class, new DurationSerializer(ChronoUnit.SECONDS)); builder.deserializerByType(Duration.class, DurationDeserializer.INSTANCE); }; } }
方式二:给ObjectMapper添加@Primary注解
package org.something.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.DurationSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import java.time.temporal.ChronoUnit; @Configuration public class JacksonConfig { @Bean @Primary public ObjectMapper objectMapper() { ObjectMapper mapper = JsonMapper.builder() .addModule(new JavaTimeModule()) // 显式配置Duration的序列化器/反序列化器 .serializerByType(Duration.class, new DurationSerializer(ChronoUnit.SECONDS)) .deserializerByType(Duration.class, DurationDeserializer.INSTANCE) .build(); return mapper; } }
3. 排查依赖冲突
执行依赖分析命令(Maven:mvn dependency:tree,Gradle:./gradlew dependencies),检查是否有其他依赖引入了不同版本的Jackson组件,若有则通过<exclusions>标签排除冲突版本。
内容的提问来源于stack exchange,提问作者Suvid Sahay
相关产品推荐
相关产品推荐

