Camel Bean绑定:如何从变量向Bean方法传递参数?
解决方案
你遇到的问题是因为在Bean URI里直接写to会被解析成字面量字符串,而非你定义的Java变量取值。下面给你几种可行的解决方式:
1. 直接拼接URI字符串(构建时传参)
因为你的to变量是在路由启动前就确定的(来自configuration.getTo()),可以直接把变量值拼接到Bean调用的URI中:
String to = configuration.getTo(); from(configuration.getFrom()) .to("bean:splitFileByProductType?method=emptyDirectory(" + to + ")") // 后续路由逻辑
这种方式简单直接,适合参数值在路由初始化阶段就固定的场景。如果路径包含空格、特殊字符,记得做转义处理。
2. 用Simple表达式传递运行时参数
如果需要在路由运行时动态传递参数(比如参数来自Exchange属性、消息体),可以先把变量存入Exchange属性,再通过Simple表达式引用:
String to = configuration.getTo(); from(configuration.getFrom()) .setProperty("targetDir", constant(to)) // 将值存入Exchange属性 .to("bean:splitFileByProductType?method=emptyDirectory(${exchangeProperty.targetDir})") // 后续路由逻辑
这里的${exchangeProperty.targetDir}会让Camel在运行时从Exchange属性中读取对应值,而非当作字面量处理。
3. 类型安全的Bean方法引用(推荐)
Java DSL支持更优雅的类型安全调用方式,避免字符串URI的解析问题,直接通过方法引用传递参数:
String to = configuration.getTo(); // 假设你已获取到splitFileByProductType的实例(比如从Spring容器注入) SplitFileByProductType beanInstance = ...; from(configuration.getFrom()) // Lambda表达式写法,更直观 .bean(beanInstance, () -> beanInstance.emptyDirectory(to)) // 或者简洁的方法引用写法 // .bean(beanInstance, "emptyDirectory(" + to + ")") // 后续路由逻辑
这种方式符合Java类型安全特性,更易维护和调试。
内容的提问来源于stack exchange,提问作者Ivana
相关产品推荐
相关产品推荐

