如何完全禁用Apache Camel对特殊字符的解析以避免占位符报错?
解决Apache Camel解析含
{{}}字符串报错的问题 问题重现
当处理包含{{}}格式的字符串时,Camel会将其识别为Simple语言的属性占位符尝试解析,导致抛出找不到对应属性的错误,示例错误日志如下:
2025-04-22 16:56:15,987 ERROR [org.apa.cam.qua.mai.CamelMainRuntime] (main) Failed to start application: org.apache.camel.FailedToCreateRouteException: Failed to create route actualRouteId at: >>> To[log:thisIs{{broken}}completely] <<< in route: Route(actualRouteId)[From[direct:someRoute] -> [To[log:thisI... because of Failed to resolve endpoint: log:thisIs{{broken}}completely due to: Property with key [broken] not found in properties from text: log:thisIs{{broken}}completely
问题主要出现在两个场景:
- 使用Log组件记录含
{{}}的字符串 - 通过SQL查询映射Bean时,SQL或返回数据中包含
{{}}
针对性解决方案
1. Log组件场景
方法一:使用raw()表达式包裹原始字符串
告诉Camel直接使用字符串内容,不触发任何解析:
// 静态字符串场景 .toD("log:${raw('thisIs{{broken}}completely')}") // 动态内容场景(比如从消息体获取) .toD("log:${raw(${body})}")
方法二:关闭Log组件的消息格式解析
在Log端点配置中添加useMessageFormat=false,禁用占位符解析:
.to("log:myLogger?message=thisIs{{broken}}completely&useMessageFormat=false")
方法三:转义占位符
将{{}}转义为\{{\}},仅适合静态字符串场景:
.to("log:thisIs\\{{broken\\}}completely")
2. JDBC与Bean映射场景
避免用simple()处理含{{}}的SQL
如果SQL语句中包含{{}},不要用simple()解析,改用raw()直接传入原始SQL:
.setBody(raw("SELECT * FROM table WHERE content = 'thisIs{{broken}}completely'")) .toD("jdbc:outputType=SelectList&outputClass=my.wonderful.class")
动态JDBC端点的处理
如果JDBC端点参数中包含{{}},同样用raw()包裹对应部分:
.toD("jdbc:outputType=SelectList&outputClass=${raw('my.wonderful.class')}")
3. 全局禁用{{}}占位符解析
如果整个应用都不需要Camel解析{{}}格式的占位符,可以修改占位符的前缀后缀,让Camel不再识别{{}}:
配置文件方式(application.properties)
camel.properties.placeholder-prefix=[$[ camel.properties.placeholder-suffix=]]
代码配置方式
PropertiesComponent propertiesComponent = camelContext.getComponent("properties", PropertiesComponent.class); // 自定义占位符前缀后缀,替换默认的{{}} propertiesComponent.setPlaceholderPrefix("[$["); propertiesComponent.setPlaceholderSuffix("]]");
这样Camel会使用新的前缀后缀解析属性,原有的{{}}字符串会被当作普通文本处理。
内容的提问来源于stack exchange,提问作者Toto
相关产品推荐
相关产品推荐

