spring-integration - 如何使用 SpEL 读取 Spring 集成路由器中的有效负载和标头内容
问题描述
我项目中的技术
Spring Boot 2
Spring Integration (XML style)
Java 8
Tomcat 9.x/Liberty 19.0.0.1
作为我的 Spring 集成项目的一部分(带有入站 http 网关的 REST API,它接受 XML 输入并产生 XML 输出),我正在编写以下组件:
- 一个服务激活器,根据其 XSD 对传入的 XML 执行基本验证。
- 如果验证成功,将使用名为“isError”的布尔实例变量/属性设置为 true 来构建 POJO(构建器模式 Java 对象)。
- 如果验证不成功,POJO(构建器模式 Java 对象)将使用名为“isError”的布尔实例变量/属性设置为 false。
- 构建 POJO 后,将其包装成 Message 并发送到输出通道。
- 有一个路由器组件从输出通道获取消息,并根据有效负载/POJO 中的“isError”属性的值决定目标路由/通道。
POJO 类的草稿(实际上,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 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>
终于来到我的问题,在这个“路由器”中,
问题 1) SpEL 表达式 (payload.isError) 似乎有问题,因为我在调用路由器期间遇到了一个异常,如下所示:
org.springframework.expression.spel.SpelEvaluationException:EL1008E:在“com.amb.restSample.core.model.Composite”类型的对象上找不到属性或字段“isError” - 可能不是公共的或无效的?在 org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217) ~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE] ... ...
你能告诉我如何访问复合 POJO 中的布尔“isError”属性吗?这是假设发送到路由器的消息是消息
- 问题 2) 如果我希望在将“isError”属性作为消息头(字符串)发送到路由器之前(而不是将其用作复合 POJO 中的布尔属性),是否有访问它的表达式?
解决方案
看起来paylaodMIComposite
不是Composite
。
在任何情况下,SpEL 都使用 JavaBean 约定;isError()
布尔属性的吸气剂也是如此error
。所以payload.error
应该工作(只要MIComposite
暴露它)。或者你可以使用payload.isError()
.
如果它在标题中,则表达式为headers['myHeader']
.
推荐阅读
- neo4j - 如何有效地找到多个关系大小
- python - 如何将txt文件中的两个字符串二进制数相乘
- sql - 复制已更改的 SQL 数据
- angular - 离子网络安全配置
- python - 运行 .py 文件时批处理文件抛出错误:ValueError invalid literal for int()
- highslide - 当 url 具有 https:// 时,不会弹出 Highslide 图像
- mysql - Kubernetes 内部的通信 Wordpress 和外部 MySQL 服务器。- MySQL 连接错误:(2002)
- javascript - 如果 Body 在 Jquery 中有类,则防止悬停功能
- batch-file - 如果批处理脚本中存在路径,则使用特定驱动器
- python - SparkException:卡方检验期望因子