首页 > 解决方案 > 如何使用 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 输出),我正在编写以下组件:

  1. 一个服务激活器,根据其 XSD 对传入的 XML 执行基本验证。
  2. 如果验证成功,将使用名为“isError”的布尔实例变量/属性设置为 true 来构建 POJO(构建器模式 Java 对象)。
  3. 如果验证不成功,POJO(构建器模式 Java 对象)将使用名为“isError”的布尔实例变量/属性设置为 false。
  4. 构建 POJO 后,将其包装成 Message 并发送到输出通道。
  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>

终于来到我的问题,在这个“路由器”中,

你能告诉我如何访问复合 POJO 中的布尔“isError”属性吗?这是假设发送到路由器的消息是消息

标签: spring-integrationspring-integration-dslspring-integration-http

解决方案


看起来paylaodMIComposite不是Composite

在任何情况下,SpEL 都使用 JavaBean 约定;isError()布尔属性的吸气剂也是如此error。所以payload.error应该工作(只要MIComposite暴露它)。或者你可以使用payload.isError().

如果它在标题中,则表达式为headers['myHeader'].


推荐阅读