如何在Apache Camel中使用convertBodyTo实现列表类型转换
在Apache Camel中使用convertBodyTo实现List到List的转换
当然可以通过convertBodyTo实现列表间的转换,核心是要让Camel明确识别泛型类型,而不是只指定List.class。以下是两种可行方案:
方案1:使用TypeReference指定泛型目标类型
Camel的convertBodyTo支持传入TypeReference来定义带泛型的目标类型,这样就能触发你针对List<A>到List<B>编写的转换器。
示例代码:
// ... 调用数据库获取List<A>数据 .to("jdbc:...") .convertBodyTo(new TypeReference<List<B>>() {})
需要确保你已经实现了对应的类型转换器,比如:
@Converter public class ListAToListBConverter { @Converter public static List<B> convert(List<A> source) { // 先执行分组逻辑 Map<String, List<A>> grouped = source.stream() .collect(Collectors.groupingBy(A::getGroupKey)); // 再将分组后的A集合转换为B对象列表 return grouped.values().stream() .map(group -> { B b = new B(); // 填充B的属性,基于分组后的A数据 b.setGroupData(group); return b; }) .collect(Collectors.toList()); } }
记得将这个转换器注册到Camel的类型转换器注册表中,比如在RouteBuilder里:
@Override public void configure() throws Exception { getContext().getTypeConverterRegistry() .addTypeConverter(new TypeReference<List<A>>() {}, new TypeReference<List<B>>() {}, new ListAToListBConverter()); }
方案2:直接注册List到List的转换器
如果不需要严格区分泛型的具体类型(但不推荐,容易混淆),可以直接注册一个从List到List的转换器,在转换逻辑内部处理类型检查和分组:
@Converter public class GenericListConverter { @Converter @SuppressWarnings("unchecked") public static List<B> convert(List<?> source) { if (!(source instanceof List)) { throw new IllegalArgumentException("Source is not a List"); } List<A> listA = (List<A>) source; // 执行分组逻辑 Map<String, List<A>> grouped = listA.stream() .collect(Collectors.groupingBy(A::getGroupKey)); // 转换为List<B> return grouped.values().stream() .map(this::convertGroupToB) .collect(Collectors.toList()); } private B convertGroupToB(List<A> group) { // 实现A分组到B的转换逻辑 B b = new B(); // ... 填充属性 return b; } }
注册时:
@Override public void configure() throws Exception { getContext().getTypeConverterRegistry() .addTypeConverter(List.class, List.class, new GenericListConverter()); }
之后直接调用convertBodyTo(List.class)就能触发这个转换器,但这种方式不够类型安全,优先推荐方案1。
为什么原来的写法不生效
你之前用convertBodyTo(List.class)时,Camel无法识别泛型的具体参数,只会把它当成普通的List类型,因此不会触发你针对List<A>到List<B>的自定义转换器。通过TypeReference明确泛型类型后,Camel才能匹配到对应的转换器逻辑。
内容的提问来源于stack exchange,提问作者Pampa Nello
相关产品推荐
相关产品推荐

