如何使用SpEL读取Spring Integration Router中的有效负载和头内容

问题描述 投票:0回答:1

我项目中的技术

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

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

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

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

  • 问题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”属性作为Message头(String)容纳之前将其发送到路由器(而不是将其用作Composite POJO中的布尔属性),是否有表达式来访问它?
spring-integration spring-integration-dsl spring-integration-http
1个回答
1
投票

看起来有效载荷是qazxsw poi而不是qazxsw poi。

无论如何,SpEL使用JavaBean约定;所以MIComposite是一个布尔属性Composite的吸气剂。所以isError()应该工作(只要error暴露它)。或者你可以使用payload.error

如果它在标题中,则表达式为MIComposite

© www.soinside.com 2019 - 2024. All rights reserved.