У меня есть маршрут 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>
springPropertyConfigurer
, который определяет префикс-заполнитель{{
и суффикс-заполнитель}}
для любых свойств, которые поступают из определенного файла свойств. Это работает и с другими маршрутами в моем приложении. - person jewbix.cube   schedule 09.09.2015