gpt4 book ai didi

java - 在 Spring Integration 中将 MessageHeader 的键设置为 'NEW' 时出现 SpelParseException

转载 作者:行者123 更新时间:2023-12-01 12:59:29 25 4
gpt4 key购买 nike

下面的代码是在 Spring Integration 2.2.6 中设置 MessageHeader 的 'NEW' 键。

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

下面的代码从 SI 配置文件的 header 中检索“NEW”键的值。

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

“NEW” header 的设置如下面的日志所示。

[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(])'

通过将 MessageHeader 的键从 'NEW' 更改为 'STATUS_NEW' 即可解决,如下所示:

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 中使用名称作为键有一些限制?

最佳答案

这不是 Spring Integration 的问题。这是一般的 SpEL 限制。很难找到,但是我从debug中挖出来的:

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 属性访问器,而不是映射。

受限 token :

  • 真实

关于java - 在 Spring Integration 中将 MessageHeader 的键设置为 'NEW' 时出现 SpelParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com