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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:24:05