如何使用SpEL在Spring Integration Router中读取有效载荷和标头内容

时间:2019-03-22 16:13:59

标签: spring-integration spring-integration-dsl spring-integration-http

项目中的技术

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

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

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

最后在这个“路由器”中问我一个问题,

  • 问题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] ... ...

能否请您告诉我如何访问Composite POJO中的布尔“ isError”属性?假设发送到路由器的消息是消息

  • 问题2) 如果我希望将“ isError”属性作为消息头(字符串)容纳在发送给路由器之前(而不是将其用作Composite POJO中的布尔属性),是否有表达式可以访问它?

1 个答案:

答案 0 :(得分:1)

看起来支付宝是MIComposite而不是Composite

在任何情况下,SpEL都使用JavaBean约定。因此isError()是布尔属性error的获取者。因此payload.error应该可以工作(只要MIComposite公开它即可)。或者,您可以使用payload.isError()

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