Почему мой условный маршрут Apache Camel всегда выполняет первую опцию?

У меня есть маршрут 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 ответ

Поздний ответ, но может быть полезным в будущем. Из документации:

Парсер ограничен поддержкой только одного оператора.
Чтобы включить его, левое значение должно быть заключено в ${ }, Синтаксис:

${leftValue} OP rightValue

Вы должны использовать верблюд-простое выражение. Т.е. установить заголовок со значением вашего свойства, затем использовать ${headers.yourHeader} внутри <when>,

РЕДАКТИРОВАТЬ: Я нашел лучшее решение: используйте простой верблюд способ получить свойство: ${properties:com.acme.ValidatorOn}

Другие вопросы по тегам