我现在在Camel中使用这个XML DSL:
<route>
...
<setProperty propertyName="inputFilepath">
<xpath resultType="java.lang.String">/tla:InputType/tla:inputFilepath/text()</xpath>
</setProperty>
<setProperty propertyName="outputFilepath">
<xpath resultType="java.lang.String">/tla:InputType/tla:outputFilepath/text()</xpath>
</setProperty>
<bean ref="bean1" method="process(${property.inputFilepath},${property.outputFilepath})"/>
...
但我想用更接近的东西:
<route>
...
<bean ref="bean1" method="process(xpath('/tla:InputType/tla:inputFilepath/text()'),xpath('/tla:InputType/tla:inputFilepath/text()'))"/>
...
我能用的东西比我目前的路线更乱吗?
我不想在bean中使用@XPath,因为我不希望依赖于嵌入在bean类中的外部环境。
我确实看过OGNL,我认为它可以在一个简单的表达式中使用,所以有类似的东西:
<bean ref="bean1" method="process(${body.InputType.inputFilepath},${body.InputType.inputFilepath})"/>
或
<bean ref="bean1" method="process(${body.tla:InputType.tla:inputFilepath},${body.tla:InputType.tla:inputFilepath})"/>
但都没有奏效。
我还怀疑我应该使用标头而不是属性,因为值只需要持续到方法调用,而不是其余的交换。我也有兴趣听到有关这方面的意见。
感谢有关改善这一点的想法!
答案 0 :(得分:0)
您可以在传入的有效负载中执行XSL,然后调用bean,而不是设置属性并将其作为方法参数发送。这将减少设置属性并使用属性值调用bean。第一行将是XSL转换,然后您可以调用处理器。处理器将能够从传入的交换中获取所需的值,这是转换的结果。
答案 1 :(得分:0)
您可以使用XSL,而不是执行多个设置属性。在bean的下一步中,您可以使用xstream或jaxb解析器将xml转换为pojo。通过这种方式,您可以避免在bean或camel-context.xml中执行xpath。
步骤1.FileTransform.XSL(示例) 第2步。在Bean / Processor中 创建一个名为FileProp的Pojo,其中包含inputFilePath,outputFilePath作为String(s)。使用类似Xstream的解析器并将传入的XML转换为POJO(使用fromXML方法) http://x-stream.github.io/javadoc/com/thoughtworks/xstream/XStream.html http://x-stream.github.io/tutorial.html 现在你有了一个可以在bean中轻松使用的POJO