Apache Camel路由getBody强转String触发ClassCastException问题求助
问题根因
Camel 中消息体的实际类型会随流经的组件动态变化,你当前消息来源于JMS组件,
exchange.getIn().getBody()返回的可能是字节数组、JMSTextMessage实例、序列化对象等非String类型,直接强制转换必然抛出ClassCastException。
你去掉判断逻辑后路由正常运行,是因为Camel的file组件内置了自动类型转换逻辑,会自动将任意支持的消息体类型转换为可写入文件的格式,不需要手动处理类型。另外你在日志中看到${in.body}输出为字符串,也是因为log组件自动调用了Camel的类型转换能力,不代表消息体实际类型就是String。
可行解决方案
- 方案1:使用Camel内置类型转换方法(最推荐)
不要调用无参getBody()后强转,调用带类型参数的重载方法,Camel会自动调用内置的TypeConverter完成兼容转换:
@Override public boolean matches(Exchange exchange) { // 自动转换为String,支持绝大多数常见类型的转换 String body = exchange.getIn().getBody(String.class); return body != null && body.contains("output wished"); }
- 方案2:路由中提前统一转换消息体类型
在进入判断逻辑前先通过convertBodyTo将消息体统一转为String,后续所有处理都不需要再处理类型问题:
@Override public void configure() { ... .log(LoggingLevel.DEBUG, "AfterHttp IN: ${in.headers} - ${in.body}") // 提前转换消息体为String .convertBodyTo(String.class) .choice().when(new Predicate() { @Override public boolean matches(Exchange exchange) { String body = (String) exchange.getIn().getBody(); return body.contains("output wished"); } }).to("file://out/wished").end(); }
- 方案3:使用Camel Simple表达式简化逻辑
不需要自定义Predicate,直接用Camel内置的Simple表达式完成判断,框架自动处理类型转换,代码更简洁:
@Override public void configure() { ... .log(LoggingLevel.DEBUG, "AfterHttp IN: ${in.headers} - ${in.body}") .choice() // Simple表达式自动完成类型转换和包含判断 .when(simple("${body} contains 'output wished'")) .to("file://out/wished").end(); }
内容的提问来源于stack exchange,提问作者hingiswiss
相关产品推荐
相关产品推荐

