Camel ProducerTemplate指定返回类型时空Body问题及集合类型使用咨询
1. 替代Dummy Body的可行方案
你遇到的歧义问题其实是因为requestBody(null, AType.class)触发了多个重载方法的匹配,编译器无法确定选哪个。这里有几个更优雅的替代方案:
使用带Exchange自定义的request方法(Camel 2.20+支持)
这个方法允许你直接构建一个空的Exchange,同时指定返回类型,完美适配无参bean的场景:AType response = producer.request("bean:yourTargetBean", exchange -> { // 无需设置body,因为你的bean是无参的 }, AType.class);明确指定body类型的重载方法
用requestBody(Class<?> bodyType, Object body, Class<T> outType)这个重载,把body类型指定为Void.class,就能避免歧义:AType response = producer.requestBody(Void.class, null, AType.class);这样编译器能明确匹配到正确的方法,同时传递null body也符合你的业务需求。
手动构建Exchange发送
如果你用的是较老版本的Camel,也可以手动创建Exchange并发送:Exchange exchange = producer.createExchange(ExchangePattern.InOut); // 不需要设置body Exchange resultExchange = producer.send("bean:yourTargetBean", exchange); AType response = resultExchange.getOut().getBody(AType.class);
2. 无需强制转换直接使用Collection作为AType
这取决于你的AType具体是什么类型:
如果AType是泛型Collection(比如List
)
直接用Class无法传递泛型信息,这时候可以用TypeToken来获取泛型类型,Camel支持传入Type的重载方法:List<YourItem> response = producer.requestBody(Void.class, null, new TypeToken<List<YourItem>>() {}.getType());如果AType是自定义Collection实现
只要你的bean返回的确实是AType实例,直接用AType.class作为返回类型即可。如果返回的是其他Collection(比如ArrayList),可以在路由中添加convertBodyTo(AType.class)来自动转换,或者在调用时指定类型让Camel的转换器处理。之前包装到对象中失败,大概率是因为路由返回的类型和你期望的包装对象不匹配,或者没有正确配置类型转换,你可以检查下路由的输出类型是否符合预期。
关于API改进建议
你提到的希望ProducerTemplate支持无参requestBody()或者多参数requestBody(String.. args, Class<T> type)的需求,其实可以通过Apache Camel的官方Issue Tracker提交Feature Request,详细说明你的业务场景,社区会评估是否在后续版本中添加这些方法。不过目前上面的方案已经能很好地解决你的问题啦。
内容的提问来源于stack exchange,提问作者Hey StackExchange

