Почему мой условный маршрут 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>

person jewbix.cube    schedule 08.09.2015    source источник
comment
Где вы нашли пример использования заполнителя {{}} вместо $ {}?   -  person piezol    schedule 09.09.2015
comment
У меня есть bean-компонент springPropertyConfigurer, который определяет префикс-заполнитель {{ и суффикс-заполнитель }} для любых свойств, которые поступают из определенного файла свойств. Это работает и с другими маршрутами в моем приложении.   -  person jewbix.cube    schedule 09.09.2015
comment
На мой взгляд, проблема выглядит странно, но, вообще говоря, SIMPLE не рекомендуется использовать, если левая сторона не является функцией, оцениваемой данными из обмена (issues.apache.org/jira/browse/)   -  person piezol    schedule 11.09.2015
comment
Посмотрите комментарии в опубликованной мной ссылке. Вы пробовали заменить его на спель? ‹Spel› # {com.blahblahthiswillnotwork.ValidatorOn == true} ‹/spel›   -  person piezol    schedule 11.09.2015
comment
Вы нашли решение своей проблемы?   -  person piezol    schedule 14.09.2015
comment
Нет. Мы пробовали ‹spel› и ‹xpath›, но обычно получаем тот же синтаксис или нераспознанные ошибки аргумента для левой части выражения. Мы считаем, что нам, возможно, придется справиться с этим в Java-компоненте.   -  person jewbix.cube    schedule 14.09.2015


Ответы (1)


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

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

${leftValue} OP rightValue

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

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

person dey    schedule 28.11.2015