我有一个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&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&uriResolver=uriResolver"/>
<process ref="com.acme.MetricsProcessor"/>
</policy>
</route>
答案 0 :(得分:1)
迟到的答案,但将来可能会有所帮助。来自documentation:
解析器仅限于支持单个运算符
要启用它,必须将左值括在${ }
中。语法是:
${leftValue} OP rightValue
你必须使用camel-simple表达式。即使用您的媒体资源的价值设置标题,然后在${headers.yourHeader}
内使用<when>
。
编辑:我找到了一个更好的解决方案:使用骆驼简单方法获取属性:${properties:com.acme.ValidatorOn}