Camel:如何使用简单比较设置boolean header参数?

时间:2014-05-07 16:34:36

标签: type-conversion apache-camel

我正在尝试使用simple expression language设置标头参数(param2):

from("timer://foo?repeatCount=1")
    .setBody(constant("on,off"))
    .split()
    .tokenize(",")
    .setHeader("param1", simple("${body}"))
    .setHeader("param2", simple("${header.param1} == 'on'"))
    .log("param1 = [${header.param1}], param2 = [${header.param2}]");

但结果我得到一个字符串集而不是布尔值,以下内容被记录:

param1 = [on], param2 = [on == 'on']
param1 = [off], param2 = [off == 'on']

我希望它能记录下来:

param1 = [on], param2 = [true]
param1 = [off], param2 = [false]

文档写道,可以使用simple进行比较,我可以在做出选择时使其正常工作:

from("timer://foo?repeatCount=1")
    .setBody(constant("on,off"))
    .split()
    .tokenize(",")
    .setHeader("param1", simple("${body}"))
    .choice()
        .when(simple("${header.param1} == 'on'"))
            .setHeader("param2", constant(true))
        .otherwise()
            .setHeader("param2", constant(false))
        .end()
    .log("param1 = [${header.param1}], param2 = [${header.param2}]");

输出是:

param1 = [on], param2 = [true]
param1 = [off], param2 = [false]

但为什么它不能直接分配呢?

3 个答案:

答案 0 :(得分:1)

您可以定义àsimpleexpression的结果类型,如此

.setHeader("param2", simple("${header.param1} == 'on'", Boolean.class))

答案 1 :(得分:1)

另一种方法是使用像MVEL这样的表达式语言。使用camel mvel组件并将路径写为

        from("timer://foo?repeatCount=1")
            .setBody(constant("on,off"))
            .split()
            .tokenize(",")
            .setHeader("param1", simple("${body}"))
            .setHeader("param2").mvel("request.headers.param1 == 'on'")
            .log("param1 = [${header.param1}], param2 = [${header.param2}]");

答案 2 :(得分:1)

这是一个错误。我测试了2.12.3,2.13.0,2.12-SNAPSHOT和2.13-SNAPSHOT并且操作员处理不正确。即使设置输出类型也无济于事。

顺便说一句,您也可以使用Groovy来解决您的问题:

 .setHeader("param2").groovy("request.headers.param1.equals('on')")

修改 此错误已在2.12.4,2.13.1和2.14.0中修复,请参阅CAMEL-7298