我可以直接在bean方法调用中使用xpath吗?

时间:2014-10-15 10:12:48

标签: apache-camel

我现在在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})"/>

但都没有奏效。

我还怀疑我应该使用标头而不是属性,因为值只需要持续到方法调用,而不是其余的交换。我也有兴趣听到有关这方面的意见。

感谢有关改善这一点的想法!

2 个答案:

答案 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

相关问题