Blueprint属性注入Java DSL Camel Routebuilder失败:列表无法获取
解决在RouteBuilder中获取Blueprint配置列表的问题
我来帮你搞定这个在RouteBuilder里读取Blueprint配置列表的问题!下面分步骤给你讲清楚怎么操作:
1. 先确认Blueprint命名空间配置
首先得保证你的blueprint-bean.xml顶部已经声明了配置管理的命名空间,不然cm:前缀的配置根本不会生效:
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" xsi:schemaLocation=" http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd">
2. 修正配置里的小问题
你当前配置的value标签里加了多余的引号,这些引号会被当成字符串内容的一部分(比如获取到的是"test 1"而不是test 1),建议去掉:
<cm:default-properties> <cm:property name="test-list"> <list> <value type="java.lang.String">test 1</value> <value type="java.lang.String">test 2</value> <value type="java.lang.String">test 3</value> </list> </cm:property> </cm:default-properties>
3. 在RouteBuilder中获取列表的两种实用方法
方法一:依赖注入(推荐)
这种方式更符合Spring/Blueprint的依赖注入思想,代码也更清晰:
第一步:编写RouteBuilder类
import org.apache.camel.builder.RouteBuilder; import java.util.List; public class MyRouteBuilder extends RouteBuilder { private List<String> testList; // 提供setter方法,供Blueprint容器注入属性 public void setTestList(List<String> testList) { this.testList = testList; } @Override public void configure() throws Exception { // 在这里直接用testList就行啦 from("direct:start") .log("获取到的列表内容: ${body}") .process(exchange -> exchange.getIn().setBody(testList)); } }
第二步:在Blueprint中配置RouteBuilder并注入属性
<!-- 把你的RouteBuilder定义成Blueprint管理的bean --> <bean id="myRoute" class="com.example.MyRouteBuilder"> <!-- 将配置里的test-list列表注入到bean的testList属性 --> <property name="testList" value="${test-list}"/> </bean> <!-- 启动Camel上下文 --> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <routeBuilder ref="myRoute"/> </camelContext>
方法二:通过PropertiesComponent直接获取
如果不想用依赖注入,也可以在configure方法里直接从Camel上下文拿:
@Override public void configure() throws Exception { // 从PropertiesComponent中读取列表 List<String> testList = getContext().getPropertiesComponent() .getPropertyAsList("test-list", String.class); // 直接使用列表 from("direct:start") .log("列表元素总数: ${header.listSize}") .process(exchange -> { exchange.getIn().setHeader("listSize", testList.size()); exchange.getIn().setBody(testList); }); }
注意:这种方式需要确保你的Camel上下文已经关联了Blueprint的属性源,在OSGi环境下使用Blueprint的话,这一步一般是默认配置好的。
额外提醒
- 一定要让RouteBuilder被Blueprint容器管理,也就是必须在
blueprint-bean.xml里定义成bean,不能自己手动new实例,不然注入会失效。 - 如果想用
@PropertyInject注解注入,要记得开启Blueprint的注解扫描,或者给RouteBuilder类加@Component注解并配置扫描路径。
内容的提问来源于stack exchange,提问作者user9338894
相关产品推荐
相关产品推荐

