以下代码设置' 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中使用密钥名称有一些限制?
答案 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
,而不是地图。
受限制的令牌: