如何使用 SpEL 读取 Spring Integration Router 中的负载和 header 内容
How to use SpEL to read payload and header content in a Spring Integration Router
我项目中的技术
Spring Boot 2
Spring Integration (XML style)
Java 8
Tomcat 9.x/Liberty 19.0.0.1
作为我的 Spring 集成项目(REST API 和 inbound-http-gateway 的一部分,它接受 XML 输入并产生 XML 输出), 我正在编写以下组件:
- A service-activator 对传入的 XML 与其 XSD 进行基本验证。
- 如果验证成功,将构建一个 POJO(builder-pattern Java object),并将名为 "isError" 的布尔实例 variable/property 设置为 true .
- 如果验证是 un-successful,POJO(一个 builder-pattern Java object)是用一个名为 "isError" 的布尔实例 variable/property 构建的] 设置为假。
- 构建 POJO 后,它被包装成消息并发送到 output-channel。
- 有一个路由器组件从outout-channel获取消息并根据"isError"属性中的值决定目标route/channelpayload/POJO.
POJO 草稿class(实际上,POJO 将具有更多属性,但对于我们的示例,保持简短):
public class Composite {
private Boolean isError;
private Composite(CompositeBuilder compositeBuilder) {
this.isError = miCompositeBuilder.isError;
}
public boolean isError() {
return isError;
}
//Builder
public static class CompositeBuilder {
private Boolean isError;
public CompositeBuilder(Boolean isError) {
this.isError = isError;
}
public Composite build() {
return new Composite(this);
}
}
}
XML 中的验证器 service-activator 组件:
<!-- SERVICE ACTIVATOR FOR REQUEST VALIDATION -->
<int:service-activator ref="myService"
method="validateMYRequest"
input-channel="myGatewayRequests"
output-channel="compositesPostRequestValidation" />
XML中的路由器组件:
<!-- ROUTER POST-REQUEST VALIDATION -->
<int:router input-channel="compositesPostRequestValidation" expression="payload.isError">
<int:mapping value="true" channel="upstreamResponses"/>
<int:mapping value="false" channel="downstreamValidatedRequests"/>
</int:router>
终于来回答我的问题了,在这个"router",
问题1)
SpEL 表达式 (payload.isError) 似乎有问题,因为我在调用路由器期间遇到异常:
org.springframework.expression.spel.SpelEvaluationException:EL1008E:属性 或字段 'isError' 无法在 'com.amb.restSample.core.model.Composite' 类型的 object 上找到 - 可能不是 public 或无效?
在 org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE]
...
...
你能告诉我如何访问 Composite POJO 中的布尔值 "isError" 属性 吗?这是假设发送到路由器的消息是 Message
- 问题 2)
如果我希望在将 "isError" 属性 作为消息 header (字符串)发送到路由器之前将其容纳(而不是将其用作 Composite 中的布尔值 属性 POJO),有没有表达式可以访问它?
看起来有效载荷是 MIComposite
而不是 Composite
。
无论如何,SpEL 使用 JavaBean 约定;所以 isError()
是布尔值 属性 error
的 getter。所以 payload.error
应该可以工作(只要 MIComposite
公开它)。或者你可以使用 payload.isError()
.
如果它在 header 中,表达式将是 headers['myHeader']
。
我项目中的技术
Spring Boot 2
Spring Integration (XML style)
Java 8
Tomcat 9.x/Liberty 19.0.0.1
作为我的 Spring 集成项目(REST API 和 inbound-http-gateway 的一部分,它接受 XML 输入并产生 XML 输出), 我正在编写以下组件:
- A service-activator 对传入的 XML 与其 XSD 进行基本验证。
- 如果验证成功,将构建一个 POJO(builder-pattern Java object),并将名为 "isError" 的布尔实例 variable/property 设置为 true .
- 如果验证是 un-successful,POJO(一个 builder-pattern Java object)是用一个名为 "isError" 的布尔实例 variable/property 构建的] 设置为假。
- 构建 POJO 后,它被包装成消息并发送到 output-channel。
- 有一个路由器组件从outout-channel获取消息并根据"isError"属性中的值决定目标route/channelpayload/POJO.
POJO 草稿class(实际上,POJO 将具有更多属性,但对于我们的示例,保持简短):
public class Composite {
private Boolean isError;
private Composite(CompositeBuilder compositeBuilder) {
this.isError = miCompositeBuilder.isError;
}
public boolean isError() {
return isError;
}
//Builder
public static class CompositeBuilder {
private Boolean isError;
public CompositeBuilder(Boolean isError) {
this.isError = isError;
}
public Composite build() {
return new Composite(this);
}
}
}
XML 中的验证器 service-activator 组件:
<!-- SERVICE ACTIVATOR FOR REQUEST VALIDATION -->
<int:service-activator ref="myService"
method="validateMYRequest"
input-channel="myGatewayRequests"
output-channel="compositesPostRequestValidation" />
XML中的路由器组件:
<!-- ROUTER POST-REQUEST VALIDATION -->
<int:router input-channel="compositesPostRequestValidation" expression="payload.isError">
<int:mapping value="true" channel="upstreamResponses"/>
<int:mapping value="false" channel="downstreamValidatedRequests"/>
</int:router>
终于来回答我的问题了,在这个"router",
问题1) SpEL 表达式 (payload.isError) 似乎有问题,因为我在调用路由器期间遇到异常:
org.springframework.expression.spel.SpelEvaluationException:EL1008E:属性 或字段 'isError' 无法在 'com.amb.restSample.core.model.Composite' 类型的 object 上找到 - 可能不是 public 或无效? 在 org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE] ... ...
你能告诉我如何访问 Composite POJO 中的布尔值 "isError" 属性 吗?这是假设发送到路由器的消息是 Message
- 问题 2) 如果我希望在将 "isError" 属性 作为消息 header (字符串)发送到路由器之前将其容纳(而不是将其用作 Composite 中的布尔值 属性 POJO),有没有表达式可以访问它?
看起来有效载荷是 MIComposite
而不是 Composite
。
无论如何,SpEL 使用 JavaBean 约定;所以 isError()
是布尔值 属性 error
的 getter。所以 payload.error
应该可以工作(只要 MIComposite
公开它)。或者你可以使用 payload.isError()
.
如果它在 header 中,表达式将是 headers['myHeader']
。