如何在Guidewire中配置Camel Route使用的Jackson ObjectMapper?
问题解答
环境说明
Guidewire Integration Gateway 应用,使用 Apache Camel 4.4.4
问题描述
如何配置或在哪里配置应用中Camel路由使用的Jackson ObjectMapper?路由默认使用的ObjectMapper不包含通过@Inject注解获取的ObjectMapper所配置的预期模块。
可通过以下代码获取已注册模块的camel-jackson ObjectMapper:
@Inject private ObjectMapper jacksonObjectMapper;
路由示例:
from("direct:policy-search") .routeId("pcPolicySearch") .process(this::doPCSearch) //读取参数并设置exchange body .marshal().json(JsonLibrary.Jackson) //将body转换为json字符串
已尝试的无效方案
- 在Route的
configure()方法中设置全局选项,无效果,路由仍使用无模块的默认映射器:
getCamelContext().getGlobalOptions().put("useDefaultObjectMapper", "false"); getCamelContext().getGlobalOptions().put("autoDiscoverObjectMapper", "true");
- 添加标注
@Configure的类,但该类从未被调用; - 添加
application.properties文件,配置未生效:
camel.component.jackson.useDefaultObjectMapper=false camel.component.jackson.autoDiscoverObjectMapper=true
- 在
gw-application.yaml中设置相同配置,配置未生效,dataformat的useDefaultObjectMapper始终为true:
camel: component: jackson: use-default-object-mapper: false auto-discover-object-mapper: true
额外发现
从exchange的注册表中能获取到所需的ObjectMapper,但路由执行时dataformat上的ObjectMapper仍无任何模块:
Map<String, ObjectMapper> s=getCamelContext().getRegistry().findByTypeWithName(ObjectMapper.class);
解决方案
方法1:显式绑定自定义ObjectMapper到JacksonDataFormat
直接在路由中创建自定义JacksonDataFormat实例,绑定你通过@Inject获取的ObjectMapper,确保路由使用带预期模块的映射器:
@Inject private ObjectMapper jacksonObjectMapper; @Override public void configure() throws Exception { // 创建自定义Jackson数据格式 JacksonDataFormat jacksonDataFormat = new JacksonDataFormat(); jacksonDataFormat.setObjectMapper(jacksonObjectMapper); jacksonDataFormat.setUseDefaultObjectMapper(false); from("direct:policy-search") .routeId("pcPolicySearch") .process(this::doPCSearch) .marshal(jacksonDataFormat); // 使用自定义的数据格式 }
方法2:注册全局可复用的JacksonDataFormat
如果多个路由需要复用同一个自定义ObjectMapper,可将配置好的JacksonDataFormat注册到Camel注册表,再在路由中引用:
@Inject private ObjectMapper jacksonObjectMapper; @PostConstruct public void registerCustomJacksonDataFormat() { JacksonDataFormat customFormat = new JacksonDataFormat(); customFormat.setObjectMapper(jacksonObjectMapper); customFormat.setUseDefaultObjectMapper(false); // 注册到注册表,指定唯一名称 getCamelContext().getRegistry().bind("customJacksonFormat", customFormat); } @Override public void configure() throws Exception { from("direct:policy-search") .routeId("pcPolicySearch") .process(this::doPCSearch) .marshal("customJacksonFormat"); // 引用注册好的数据格式 }
方法3:通过DataFormatConfigurer适配Guidewire环境
由于Guidewire可能会覆盖Camel的默认配置逻辑,可创建实现DataFormatConfigurer的类,显式配置JacksonDataFormat使用自定义ObjectMapper:
import org.apache.camel.spi.DataFormatConfigurer; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.camel.component.jackson.JacksonDataFormat; import jakarta.inject.Inject; import jakarta.inject.Named; @Named public class CustomJacksonDataFormatConfigurer implements DataFormatConfigurer { @Inject private ObjectMapper jacksonObjectMapper; @Override public void configureDataFormat(org.apache.camel.spi.DataFormat dataFormat) { if (dataFormat instanceof JacksonDataFormat jacksonFormat) { jacksonFormat.setObjectMapper(jacksonObjectMapper); jacksonFormat.setUseDefaultObjectMapper(false); } } }
确保该类被Guidewire的DI容器扫描到(比如添加@Named或对应注解,具体遵循Guidewire组件注册规则)。
关键说明
- Guidewire Integration Gateway可能会拦截Camel的部分全局配置,显式绑定ObjectMapper到DataFormat是最可靠的方式;
- 可在注入ObjectMapper后验证模块是否存在:
System.out.println(jacksonObjectMapper.getRegisteredModuleIds());
内容的提问来源于stack exchange,提问作者David VanderMolen
相关产品推荐
相关产品推荐

