繁体   English   中英

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

[英]Why does my Apache Camel conditional route always execute the first option?

我有一个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更新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>

迟到的答案,但未来可能会有所帮助。 来自文档

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

${leftValue} OP rightValue

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM