如何使用 SpEL 读取 Spring 集成路由器中的有效负载和标头内容



我的项目中的技术

Spring Boot 2
Spring Integration (XML style)
Java 8
Tomcat 9.x/Liberty 19.0.0.1

作为我的 Spring 集成项目(带有入站 http-gateway 的 REST API,它接受 XML 输入并生成 XML 输出)的一部分,我正在编写以下组件:

  1. 一种服务激活器,它针对传入的 XML 的 XSD 执行基本验证。
  2. 如果验证成功,则构建一个 POJO(构建器模式 Java 对象),并将名为"isError"的布尔实例变量/属性设置为 true。
  3. 如果验证不成功,则构建 POJO(构建器模式 Java 对象)时会将名为 "isError" 的布尔实例变量/属性设置为 false。
  4. 构建 POJO 后,它被包装成消息并发送到输出通道。
  5. 有一个路由器组件从外通道获取消息,并根据有效负载/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" - 也许不是公共的或无效的? at 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']

相关内容

  • 没有找到相关文章

最新更新