关于将MessageHeader的键设置为' NEW'的SpelParseException在Spring Integration中

时间:2014-05-13 12:11:32

标签: java spring spring-integration spring-el

以下代码设置' NEW' Spring Integration 2.2.6中MessageHeader的关键。

public Message<String> getFlow() {
    return MessageBuilder.withPayload("demo").setHeader("NEW", "NEW").build();
}

以下代码检索了&#39; NEW&#39;来自SI配置文件中标题的密钥。

<jdbc:outbound-gateway
query="select name from emp where status=:headers[NEW]"
row-mapper="empMapper" data-source="dataSource"
max-rows-per-poll="100000" />

&#39; NEW&#39;标题设置如下面的日志所示。

[Headers={timestamp=1399978938970, id=777bb8ba-04b6-4408-9d60-18c9711375cc, NEW=NEW}]

然而,低于例外:

org.springframework.expression.spel.SpelParseException: EL1043E:(pos 11): Unexpected token.  Expected 'identifier' but was 'rsquare(])'

通过从&#39; NEW&#39;更改MessageHeader的键来解决此问题。到&#39; STATUS_NEW&#39;如下图所示:

public Message<String> getFlow() {
    return MessageBuilder.withPayload("demo").setHeader("STATUS_NEW", "NEW").build();
}

<jdbc:outbound-gateway
query="select name from emp where status=:headers[STATUS_NEW]"
row-mapper="empMapper" data-source="dataSource"
max-rows-per-poll="100000" />

这是SpEL中的错误还是在MessageHeader中使用密钥名称有一些限制?

1 个答案:

答案 0 :(得分:1)

这不是Spring Integration的问题。这是一般的SpEL限制。很难找到它,但我从调试中挖掘它:

private boolean maybeEatConstructorReference() {
        if (peekIdentifierToken("new")) {
...

和该方法的代码:

private boolean peekIdentifierToken(String identifierString) {
        if (!moreTokens()) {
            return false;
        }
        Token t = peekToken();
        return t.kind==TokenKind.IDENTIFIER && t.stringValue().equalsIgnoreCase(identifierString);
}

如你所见equalsIgnoreCase在这里做的事情。

不确定是否适合将其标记为SpEL的错误,但无论如何它都是限制,您应该使用不同的标识符。 或者尝试这种语法:

select name from emp where status=:headers.NEW

bean property accessor,而不是地图。

受限制的令牌: