You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache CXF带PathParam的POST接口经Camel路由调用报500错误

问题重现

你的REST接口定义:

@POST @Path("/callA/{A}") 
public FObj invokeA(@PathParam("A") int a, FObj fobj);

对应的Camel路由配置:

.choice()
    .when().simple("${header.operationName} == 'CallA'")
    .to("bean:BeanA?method=invokeA")

调用时报错:

org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange
Caused by: org.apache.camel.InvalidPayloadException: No body available of type: int but has value: com.dev.tp.FObj

问题根源

Camel调用Bean方法时默认的参数绑定逻辑和你的方法定义不匹配:
Camel会优先把Exchange的Body作为第一个参数传入,但你的invokeA方法第一个参数是路径参数int a,第二个才是请求体对应的FObj。这就导致Camel把Body里的FObj对象当成了需要的int类型参数,直接触发类型不匹配错误。

两种可行的解决方案

方案1:给Bean方法添加Camel参数注解(推荐)

修改invokeA方法,用Camel的@Header和@Body注解明确参数来源,让Camel能精准识别每个参数该从哪里获取:

@POST @Path("/callA/{A}") 
public FObj invokeA(@Header("A") int a, @Body FObj fobj);

注:REST组件通常会自动把路径参数A注入到Exchange的Header中,名称和路径参数名一致,所以@Header("A")可以正确拿到路径参数值。

方案2:在路由中显式指定方法参数

如果不想修改Bean方法,可以直接在路由的bean调用里,通过表达式指定每个参数的来源:

.choice()
    .when().simple("${header.operationName} == 'CallA'")
    .to("bean:BeanA?method=invokeA(${header.A}, ${body})")

这里我们直接在方法调用中传入两个参数:第一个是Header中的A(路径参数),第二个是Exchange的Body(请求体的FObj),Camel会严格按照这个表达式传递参数,完美匹配你的方法定义。

验证步骤

修改完成后重新测试:

  • 确认Rest客户端正确设置了路径参数A和请求体FObj
  • 查看Camel日志,确认参数是否被正确传递到invokeA方法中

内容的提问来源于stack exchange,提问作者Rajeshwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:01:38