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

