Camel Quarkus未使用Quarkus自定义ObjectMapper导致LocalDate序列化失败问题求助
我来帮你解决这个问题——你遇到的核心问题是Camel默认会自己创建独立的ObjectMapper实例,并没有自动复用Quarkus上下文里你自定义的那个。这里有两种可靠的解决方式:
方法一:在单个路由中显式指定自定义ObjectMapper
首先,在你的Camel路由类中注入Quarkus管理的ObjectMapper(也就是被你的MyObjectMapperCustomizer修改过的那个),然后通过JacksonDataFormat指定使用它进行序列化:
import com.fasterxml.jackson.databind.ObjectMapper import org.apache.camel.component.jackson.JacksonDataFormat import javax.inject.Inject import javax.ws.rs.core.MediaType class TradeRoute { @Inject lateinit var objectMapper: ObjectMapper fun configure() { rest("/trades") .get().produces(MediaType.APPLICATION_JSON).route() .bean(svc.getAllTradeList()) // 替换默认的marshal方式,传入自定义的ObjectMapper .marshal(JacksonDataFormat(objectMapper)) .endRest() } }
这样Camel在序列化Trade列表时,就会使用你注册了JavaTimeModule的ObjectMapper,自然就能处理LocalDate类型了。
方法二:全局配置Camel使用Quarkus的ObjectMapper
如果你希望所有Camel路由的JSON序列化都默认使用自定义的ObjectMapper,可以通过配置文件实现,不用逐个修改路由。
在你的application.properties(或application.yml)中添加以下配置:
# 让Camel Jackson组件复用Quarkus上下文里的ObjectMapper bean camel.jackson.object-mapper-bean-name=objectMapper
这里的objectMapper是Quarkus默认的ObjectMapper bean名称,你的MyObjectMapperCustomizer已经对它做了增强(注册了JavaTimeModule),所以Camel会自动复用这个实例,所有的JSON序列化操作都会生效。
额外验证:确保依赖正确
虽然你已经添加了自定义类,但还是要确认项目依赖中包含了Jackson处理Java 8日期的核心模块:
Maven(pom.xml)
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
Gradle(build.gradle)
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
这个依赖是序列化LocalDate等Java 8日期类型的必要条件,缺一不可。
为什么之前的自定义没生效?因为Camel的Jackson组件默认不会自动发现Quarkus上下文里的ObjectMapper,它会自己初始化一个全新的实例——而这个实例并没有注册JavaTimeModule,所以遇到LocalDate就会抛出你看到的InvalidDefinitionException。通过上面两种方式,我们强制Camel使用Quarkus管理的那个已经配置好的ObjectMapper,问题就迎刃而解了。
内容的提问来源于stack exchange,提问作者user1088036

