Java Camel DSL中如何调用支持多种输入参数类型的Bean方法
Camel Java DSL 多输入类型Bean的类型安全调用方案
你当前使用的setBody().body(入参类型, 方法引用)是Camel原生支持的编译期类型安全调用方式,可通过以下几种方案实现多输入类型的适配,全程保持编译期校验、不会等到运行时才暴露问题:
方案1:方法重载适配不同输入类型
给Bean类编写对应不同入参类型的重载方法,路由调用时根据当前Body的类型传入对应的Class即可,完全匹配你现有的书写习惯:
Bean代码示例
@Component public class MyBean { // UUID类型入参方法 public String myMethod(@Body UUID id) { return "Current id is : "+ id; } // String类型入参重载 public String myMethod(@Body String id) { return "Current string id is : "+ id; } // Long类型入参重载 public String myMethod(@Body Long id) { return "Current numeric id is : "+ id; } }
路由调用示例
// Body为UUID时调用对应重载 .setBody().body(UUID.class, myBean::myMethod) // Body为String时调用对应重载 .setBody().body(String.class, myBean::myMethod) // Body为Long时调用对应重载 .setBody().body(Long.class, myBean::myMethod)
方案2:公共父类入参+内部类型判断
如果希望同一个方法兼容多种输入类型,可以使用所有输入类型的公共父类/接口作为方法入参,在方法内部做类型分支处理:
Bean代码示例
@Component public class MyBean { // 以UUID、String的公共父接口Serializable作为入参 public String myMethod(@Body Serializable id) { if (id instanceof UUID uuid) { return "Current UUID is : " + uuid; } else if (id instanceof String strId) { return "Current string id is : " + strId; } throw new IllegalArgumentException("Unsupported id type: " + id.getClass().getName()); } }
路由调用示例
.setBody().body(Serializable.class, myBean::myMethod)
方案3:路由分支自动匹配类型
如果需要在同一个路由节点自动适配不同类型的Body,可以结合choice分支路由,每个分支对应不同类型的类型安全调用:
from("my-route") .setBody(UUID::new) .choice() .when(body().isInstanceOf(UUID.class)) .setBody().body(UUID.class, myBean::myMethod) .when(body().isInstanceOf(String.class)) .setBody().body(String.class, myBean::myMethod) .when(body().isInstanceOf(Long.class)) .setBody().body(Long.class, myBean::myMethod) .otherwise() .throwException(new IllegalArgumentException("Unsupported body type")) .end();
内容的提问来源于stack exchange,提问作者d-man
相关产品推荐
相关产品推荐

