如何将配置参数注入Splitter的group属性?错误排查与正确方法
我来帮你解决这个问题,你遇到的核心问题是XML解析器的类型验证规则和Camel动态表达式的使用方式冲突了,咱们一步步理清楚:
先说说你之前写法的问题
- 直接用
{{noOfLines}}或无引号的写法:XML属性必须用引号包裹,而且即便加了引号,XML解析器会把{{noOfLines}}当成字符串,而tokenize的group属性要求是整数类型,所以触发了schema验证错误。 - 把
<simple>标签塞进属性值:XML语法不允许属性值里包含<这类特殊字符,这直接违反了XML的基本规则,所以报错提示不能有<字符。 - 直接用
${properties:noOfLines:500}:同样,XML解析器会先验证属性类型,这个占位符字符串不是合法的整数,因此抛出cvc-datatype-valid.1.2.1的类型错误。
正确的实现方式分两种场景
场景1:分组行数是启动时固定的配置
如果你的noOfLines是启动前就确定的固定值,推荐用属性占位符替换的方式,让XML加载时就把占位符换成实际的整数:
- 先在你的配置文件(比如
application.properties)里定义好参数:
noOfLines=500
- 然后在Camel XML中直接使用占位符,Spring(或Camel的属性加载器)会在初始化时把占位符替换成整数,让XML解析器通过验证:
<split streaming="true"> <tokenize token="\n" group="${noOfLines}" /> <log message="Split Group Body: ${body}"/> <to uri="bean:extractHeader"/> <to id="acceptedFileType" ref="pConsumer"/> </split>
如果你用的是纯Camel环境(不依赖Spring),需要先配置属性加载器:
<bean id="propertiesComponent" class="org.apache.camel.component.properties.PropertiesComponent"> <property name="location" value="classpath:application.properties"/> </bean>
之后同样用group="${noOfLines}"即可。
场景2:分组行数需要运行时动态确定
如果分组行数要从消息头、数据库或其他动态来源获取,就需要用Camel表达式嵌套的方式,绕过XML属性的类型验证:
<split streaming="true"> <expression> <tokenize token="\n"> <group> <!-- 这里可以用simple表达式读取配置或动态值 --> <simple>${properties:noOfLines:500}</simple> <!-- 如果要从消息头获取,换成:<simple>${header.groupSize}</simple> --> </group> </tokenize> </expression> <log message="Split Group Body: ${body}"/> <to uri="bean:extractHeader"/> <to id="acceptedFileType" ref="pConsumer"/> </split>
这种写法下,group节点里的表达式会在运行时被Camel计算,不会被XML解析器当成静态属性验证类型,完美解决了类型冲突的问题。
内容的提问来源于stack exchange,提问作者GLMills
相关产品推荐
相关产品推荐

