
在 Apache Camel 中使用 CXF 组件调用 WebService 时,CamelHttpResponseCode 并不存于 in.headers,而是作为消息体(Message Body)的属性存在;需通过 ${in.body[CamelHttpResponseCode]} 访问,而非 ${in.header.CamelHttpResponseCode}。
在 apache camel 中使用 cxf 组件调用 webservice 时,`camelhttpresponsecode` 并不存于 `in.headers`,而是作为消息体(message body)的属性存在;需通过 `${in.body[camelhttpresponsecode]}` 访问,而非 `${in.header.camelhttpresponsecode}`。
Apache Camel 的 CXF 组件默认以 POJO 模式(DataFormat.POJO)处理 SOAP 请求/响应,其底层基于 CXF 的本地 JVM 调用(非 HTTP 传输层直连),因此 HTTP 状态码(如 200、500)并非标准 HTTP 响应头的一部分,而是在 Camel 封装响应时,由 CXF Transport 或 Camel 的 CxfEndpoint 自动注入到 Exchange 的 in.body 属性映射中,键名为 "CamelHttpResponseCode"。
这意味着:
✅ 正确访问方式是 ${in.body[CamelHttpResponseCode]}(即从 Message.getBody(Map.class) 中取值);
❌ ${in.header.CamelHttpResponseCode} 始终为空,因为该值未被写入 headers。
✅ 推荐实践:使用 onCompletion() 获取响应码(推荐)
onCompletion() 在路由完成(包括所有后续 .to() 处理)后触发,确保 Exchange 已完整承载响应数据:
from(cxf("/test")
.wsdlURL("wsdl/wsdl.wsdl")
.serviceClass("org.tempuri.Class")
.dataFormat(DataFormat.POJO)
.advanced().schemaValidationEnabled(true))
.to("direct:route")
.onCompletion()
.log("${in.header.operationName} - ${in.body[CamelHttpResponseCode]}");
⚠️ 注意:onCompletion() 必须置于 .to(...) 之后——若放在 from(...) 后立即声明(如原代码),则会在请求发出后、响应尚未返回前执行,导致 CamelHttpResponseCode 尚未注入,日志输出为 null 或空字符串。
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
? 验证响应码是否存在(调试建议)
可在路由中插入临时处理器检查实际结构:
.process(exchange -> {
Object body = exchange.getIn().getBody();
Map, ?> bodyMap = body instanceof Map ? (Map, ?>) body : Collections.emptyMap();
log.info("Response body keys: {}", bodyMap.keySet());
log.info("CamelHttpResponseCode = {}", bodyMap.get("CamelHttpResponseCode"));
})
常见键还包括:"CamelHttpResponseText"(如 "OK")、"CamelHttpUri"、"operationName"(来自 WSDL 操作名)等。
? 补充说明:何时能拿到真实 HTTP 状态码?
- 若使用 DataFormat.PAYLOAD 或 DataFormat.RAW,且底层启用 HTTP Transport(如 cxf:http://...),则可通过 Exchange.HTTP_RESPONSE_CODE header 获取(需配置 httpClientConfigurer 启用 HTTP 协议栈);
- 但 POJO 模式默认走 JVM 内部调用(local:// transport),此时 CamelHttpResponseCode 是 Camel 模拟的“逻辑状态码”,通常为 200(成功)或 500(CXF 抛出 Fault),并非原始 HTTP 连接的真实状态码。
✅ 总结
| 场景 | 获取方式 | 说明 |
|---|---|---|
| POJO 模式(默认) | ${in.body[CamelHttpResponseCode]} | 值由 Camel/CXF 注入到 body map,最可靠 |
| Payload 模式 + HTTP Transport | ${in.header.Exchange.HTTP_RESPONSE_CODE} | 需显式配置 HTTP client,依赖网络层 |
| 日志中动态拼接 | ${in.header.operationName} - ${in.body[CamelHttpResponseCode]:200} | 支持默认值 fallback(:200)避免 null |
遵循上述方式,即可稳定输出形如 sayHello - 200 的日志,精准反映服务调用结果状态。











