Apache Camel 3.20.0:XML配置Splitter+Aggregate分组JSON数组报错求助
问题解决与正确配置实现
报错原因
你直接将GroupedBodyAggregationStrategy的全类名写入aggregationStrategy属性,但该属性的作用是引用注册表中已注册的bean实例名称,而非类名,因此Camel无法找到对应名称的bean,抛出找不到聚合策略的错误。
正确实现方案
方案一:直接指定聚合策略类(无需提前注册bean)
在<aggregate>标签中使用type属性替代aggregationStrategy,直接指定聚合策略的全类名,Camel会自动实例化该类:
<route> <from uri="splitter"/> <split> <!-- 拆分整个JSON数组,每个元素为单个JSON对象 --> <jsonpath>$</jsonpath> <aggregate type="org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy" completionSize="10" completionTimeout="1000"> <!-- 所有拆分出的元素都归为同一组聚合 --> <correlationExpression> <constant>true</constant> </correlationExpression> <!-- 将聚合后的List对象序列化为JSON数组 --> <marshal> <json/> </marshal> <!-- 发送分组后的JSON数组到下一路由 --> <to uri="transformer"/> </aggregate> </split> </route>
方案二:注册聚合策略为Bean后引用(适用于Spring环境)
先在Spring配置中注册聚合策略Bean:
<bean id="groupedBodyAggStrategy" class="org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy"/>
然后在路由中通过ref属性引用该Bean:
<route> <from uri="splitter"/> <split> <jsonpath>$</jsonpath> <aggregate ref="groupedBodyAggStrategy" completionSize="10" completionTimeout="1000"> <correlationExpression> <constant>true</constant> </correlationExpression> <marshal> <json/> </marshal> <to uri="transformer"/> </aggregate> </split> </route>
额外注意事项
- 修复原配置的语法错误:原配置中
< from uri : splitter>、< to uri : transformer>的语法错误,需改为标准的<from uri="splitter"/>、<to uri="transformer"/>;同时<aggregate>标签未闭合,需补全</aggregate>。 - 确保依赖齐全:需确保项目中引入了
camel-jsonpath和camel-jackson(或其他JSON组件)依赖,否则JSONPath拆分和序列化会失败。
内容的提问来源于stack exchange,提问作者Sahil Upneja
相关产品推荐
相关产品推荐

