如何通过Java DSL向Camel Context动态添加CXF客户端Endpoint?
使用Java DSL动态创建Camel CXF客户端Endpoint
我来帮你搞定这个Java DSL创建CXF Endpoint的问题!首先先回顾下你原来在blueprint.xml里的配置:
<!-- SOAP client settings --> <camelcxf:cxfEndpoint id="primeSmsMT2" address="{{prime2.url}}" wsdlURL="META-INF/wsdl/primeSmsMT.wsdl"> <camelcxf:inInterceptors> <bean class="org.apache.cxf.transport.common.gzip.GZIPInInterceptor" /> </camelcxf:inInterceptors> </camelcxf:cxfEndpoint>
你之前尝试的代码有两个核心问题:一是getEndpoint()方法是用来获取已存在的Endpoint,不是创建新的;二是直接把配置占位符{prime2.url}放进地址参数里,Camel不会自动解析这个占位符。下面是正确的实现方式:
正确的Java DSL实现步骤
- 先解析配置地址:先从配置中读取
prime2.url的实际值(这里假设你用Camel自带的PropertiesComponent来管理配置) - 实例化CxfEndpoint:直接创建CxfEndpoint对象,手动设置所有需要的属性
- 添加拦截器:和blueprint配置对应,添加GZIP入站拦截器
- 注册到Camel Context:把创建好的Endpoint注册到Camel上下文,方便路由中使用
完整代码示例:
// 1. 解析配置中的地址值 String prime2Url = getContext().getPropertiesComponent().resolveProperty("prime2.url"); // 2. 创建CxfEndpoint实例并设置基础属性 CxfEndpoint primeSmsMTEndpoint = new CxfEndpoint(); primeSmsMTEndpoint.setId("primeSmsMT2"); // 和原blueprint的id保持一致 primeSmsMTEndpoint.setAddress(prime2Url); primeSmsMTEndpoint.setWsdlURL("META-INF/wsdl/primeSmsMT.wsdl"); // 3. 添加GZIP入站拦截器 List<Interceptor<? extends Message>> inInterceptors = new ArrayList<>(); inInterceptors.add(new GZIPInInterceptor()); primeSmsMTEndpoint.setInInterceptors(inInterceptors); // 4. 将Endpoint注册到Camel Context getContext().addEndpoint(primeSmsMTEndpoint.getId(), primeSmsMTEndpoint);
额外说明
- 如果你的项目是Spring/Spring Boot环境,也可以用
@Value注解直接注入地址:@Value("${prime2.url}") private String prime2Url; - 确保项目依赖中包含了
cxf-rt-transports-http-gzip,否则GZIP拦截器会找不到类,Maven依赖示例:<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-gzip</artifactId> <version>你的CXF版本号</version> </dependency> - 注册完成后,你就可以在路由中像使用blueprint配置的Endpoint一样引用它,比如:
from("direct:sendSms") .to("cxf:bean:primeSmsMT2");
内容的提问来源于stack exchange,提问作者Andpod
相关产品推荐
相关产品推荐

