在Apache Camel中使用CXF组件调用Web服务时,CamelHttpResponseCode并不存储于消息头(in.header)中,而是作为属性(Property)存在于消息体(in.body)上下文中;直接通过${in.header.CamelHttpResponseCode}访问将返回空值,需改用${in.body[CamelHttpResponseCode]}或更可靠的exchange.getProperty("CamelHttpResponseCode")方式获取。
在apache camel中使用cxf组件调用web服务时,`camelhttpresponsecode`并不存储于消息头(`in.header`)中,而是作为属性(property)存在于消息体(`in.body`)上下文中;直接通过`${in.header.camelhttpresponsecode}`访问将返回空值,需改用`${in.body[camelhttpresponsecode]}`或更可靠的`exchange.getproperty("camelhttpresponsecode")`方式获取。
Apache Camel 的 CXF 组件用于集成基于 JAX-WS 或 JAX-RS 的 Web 服务,其底层通信通常经由 HTTP 协议完成。然而,与原生 http 或 ahc 组件不同,CXF 并不自动将 HTTP 级别状态码(如 200、500)注入到 Message.getHeaders() 中——它将该值作为 Exchange 属性(Exchange Property) 存储,键名为 "CamelHttpResponseCode",且仅在请求完成、响应返回后才可用。
因此,您原始代码中:
.onCompletion()
.log("${in.header.operationName} - ${in.header.CamelHttpResponseCode}");
无法输出响应码,原因有二:
- CamelHttpResponseCode 不是 header,而是 Exchange property;
- onCompletion() 若置于路由起始处(如 from(...).onCompletion()),其执行时机可能早于 CXF 响应处理完成,导致属性尚未写入。
✅ 正确做法是:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 将 .onCompletion() 放置在路由链末端(即 to(...) 之后),确保 Exchange 已被 CXF 组件填充完整;
- 使用 ${in.body[CamelHttpResponseCode]}(Camel 表达式语法支持从 body 对象中读取属性)或更显式、更健壮的方式:${exchangeProperty.CamelHttpResponseCode}。
以下是推荐的完整实现:
from(
cxf("/test")
.wsdlURL("wsdl/wsdl.wsdl")
.serviceClass("org.tempuri.Class")
.dataFormat(DataFormat.POJO)
.advanced().schemaValidationEnabled(true)
)
.to(direct("route"))
.onCompletion() // ✅ 执行于整个路由完成后(含CXF响应处理)
.process(exchange -> {
// ✅ 安全获取:优先尝试 exchange.getProperty,兼容所有Camel版本
Object responseCode = exchange.getProperty("CamelHttpResponseCode");
String operationName = exchange.getProperty("operationName", String.class);
log.info("{} - {}", operationName, responseCode != null ? responseCode : "N/A");
})
.end();
? 提示:operationName 同样是 CXF 注入的 Exchange 属性(非 header),可通过 exchange.getProperty("operationName") 获取;若需在 Simple 表达式中使用,可写作 ${exchangeProperty.operationName}。
⚠️ 注意事项:
- CamelHttpResponseCode 仅在 CXF 使用 HTTP 传输(如 http:// 或 https:// 地址)且未启用纯本地 JVM 调用(如 local://)时存在;若服务部署在同 JVM 内且配置为 LOCAL 模式,则无 HTTP 层,该属性为空。
- 若启用 faultStackTraceEnabled 或自定义拦截器,响应码也可能被覆盖或丢失,请确保 CXF 客户端配置未意外屏蔽响应元数据。
- 在 Spring Boot + Camel 环境中,建议配合 camel-cxf-starter 依赖,并通过 CxfEndpointConfigurer 显式启用 setLoggingFeature(true) 辅助调试。
总结:CXF 组件遵循“协议抽象”设计哲学,HTTP 细节被封装在 Exchange 属性层而非消息头中。掌握 exchange.getProperty() 的使用,是安全、可靠地提取响应状态、操作名、异常信息等关键诊断数据的前提。










