Quarkus中jackson-datatype-jsr310模块使用异常求助
解决Quarkus中控制器返回ZonedDateTime序列化失败问题
问题根源
你自定义的ObjectMapper仅在自身服务逻辑中生效,但Quarkus处理控制器返回结果序列化时,使用的是框架自动管理的全局ObjectMapper实例,该实例未注册JavaTimeModule,因此触发序列化报错。
解决方案
1. 简化依赖配置
quarkus-jackson已默认依赖jackson-datatype-jsr310和jackson-core,可移除单独声明的这两个依赖,避免版本冲突:
<!-- 仅保留此依赖即可 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jackson</artifactId> <version>3.4.1</version> </dependency>
2. 配置全局Jackson实例(二选一)
方式一:配置文件快速启用
在application.properties中添加配置,让Quarkus自动注册JavaTimeModule并处理JSR310日期类型:
# 启用JSR310日期类型支持 quarkus.jackson.add-modules=com.fasterxml.jackson.datatype.jsr310.JavaTimeModule # 关闭未知属性反序列化失败(对应原自定义配置) quarkus.jackson.deserialization.fail-on-unknown-properties=false
方式二:自定义ObjectMapperCustomizer(灵活扩展)
若需更复杂的自定义逻辑,实现Quarkus的ObjectMapperCustomizer接口,框架会自动将配置应用到全局ObjectMapper:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import io.quarkus.jackson.ObjectMapperCustomizer; import jakarta.inject.Singleton; @Singleton public class CustomJacksonConfig implements ObjectMapperCustomizer { @Override public void customize(ObjectMapper objectMapper) { objectMapper.registerModule(new JavaTimeModule()); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 可添加其他自定义配置 } }
3. 替换自定义ObjectMapper实例
删除手动创建ObjectMapper的代码,直接注入Quarkus管理的全局实例:
import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.inject.Inject; public class YourServiceClass { @Inject ObjectMapper objectMapper; // 使用框架注入的全局配置实例 // 服务逻辑代码... }
修改后,服务内部对象转换和控制器返回结果序列化会共用同一个配置完成的ObjectMapper,ZonedDateTime序列化问题即可解决。
内容的提问来源于stack exchange,提问作者Ivan Tomić
相关产品推荐
相关产品推荐

