为什么我的Apache Camel条件路由始终执行第一个选项?

时间:2015-09-08 20:22:22

标签: java routes apache-camel choice

我有一个Camel路由(其中包括)应该运行验证器,但只有在设置了某个属性时才是com.acme.ValidatorOn

路线的相关部分如下所示:

<choice>
    <when>
        <simple>{{com.acme.ValidatorOn}} == true</simple>
        <to uri="validator:MyWebService.xsd" />
    </when>
</choice>

当我注意到即使属性设置为false时验证器也总是被执行,我开始尝试使用该条件。

<choice>
    <when>
        <simple>{{com.blahblahthiswillnotwork.ValidatorOn}} == true</simple>
        <to uri="validator:MyWebService.xsd" />
    </when>
</choice>

即使使用虚假属性名称,验证程序仍在执行。所以我更进一步,并添加了<otherwise>

<choice>
    <when>
        <simple>5 == 6</simple>
        <log message="first choice" />
    </when>
    <otherwise>
        <log message="second choice"/>
    </otherwise>
</choice>

这打印出“第一选择”。无论我在<simple>中放置什么表达式,都会执行第一个选择。我已经尝试过明显不正确的表达式,例如'foo' == 'bar',甚至只是胡言乱语。

我查看了有关基于内容的路由的Camel文档,并且我设置它的方式似乎没有错误。我正在使用Camel 2.8.1和Java 8 update 45。

下面是完整的路线,以防万一路线中还有其他东西弄乱了(名称已被更改以保护无辜者):

<route autoStartup="false" id="com.acme.doStuffRoute">
    <from uri="spring-ws:rootqname:{namepace}doStuff?endpointMapping=#com.acme.EndpointMapping"/>
    <setHeader headerName="Exchange.HTTP_QUERY">
        <simple>certainProperty=${ref:certainProperty}</simple>
    </setHeader>
    <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <policy ref="com.acme.Administrators">
        <choice>
            <when>
                <simple>{{com.acme.ValidatorOn}} == true</simple>
                <to uri="validator:MyWebService.xsd"/>
            </when>
        </choice>
        <to pattern="InOut" uri="xslt:/xslt/do-stuff-request.xsl?transformerFactory=transformerFactory&amp;uriResolver=uriResolver"/>
        <to ref="com.acme.ToLogging"/>
        <transform>
            <method bean="msgTransform" method="encrypt"/>
        </transform>
        <to uri="ref:doMoreStuffEndpoint"/>
        <transform>
            <method bean="msgTransform" method="decrypt"/>
        </transform>
        <to ref="com.acme.FromLogging"/>
        <to uri="xslt:/xslt/do-stuff-request.xsl?transformerFactory=transformerFactory&amp;uriResolver=uriResolver"/>
        <process ref="com.acme.MetricsProcessor"/>
    </policy>
</route>

1 个答案:

答案 0 :(得分:1)

迟到的答案,但将来可能会有所帮助。来自documentation

解析器仅限于支持单个运算符 要启用它,必须将左值括在${ }中。语法是:

${leftValue} OP rightValue

你必须使用camel-simple表达式。即使用您的媒体资源的价值设置标题,然后在${headers.yourHeader}内使用<when>

编辑:我找到了一个更好的解决方案:使用骆驼简单方法获取属性:${properties:com.acme.ValidatorOn}