当前位置: 首页 > 知识库问答 >
问题:

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

鲁鹤轩
2023-03-14

我的项目中的技术

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

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

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

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

>

  • 问题1)SpEL表达式(payload.isError)似乎有问题,因为我在调用路由器时遇到了一个异常,如下所示:

    组织。springframework。表示斯佩尔。SpelEvaluationException:EL1008E:在类型为“com”的对象上找不到属性或字段“isError”。安博。重新取样。果心模型复合“-可能不公开或无效?在org。springframework。表示斯佩尔。阿斯特。PropertyOrFieldReference。readProperty(PropertyOrFieldReference.java:217)~[spring-expression-5.1.5.RELEASE.jar:5.1.5.RELEASE]。。。

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

    • 问题2)如果我希望在将其发送到路由器之前将isError属性作为消息头(String)容纳(而不是将其作为复合POJO中的布尔属性使用),是否有一个表达式来访问它?
  • 共有1个答案

    张建树
    2023-03-14

    看起来支付是MIComated而不是Comated

    在任何情况下,SpEL都使用JavaBean约定;因此isError()是布尔属性错误的getter。所以payload.error应该可以工作(只要MIComrix公开它)。或者可以使用payload.isError()

    如果它在头中,表达式将是headers['myHeader']

     类似资料:
    • 我这里有个小问题。在触发请求时,我希望使用HMAC对整个消息进行签名,并将生成的签名添加到头中。 所以我实施了 在的 方法I无法访问实体的字符串表示形式。它总是返回一个空字符串。原因似乎是在WriterInterceptor之后执行的MessageBodyWriter。 基本上,我有以下两种情况: 在这里,do某位SuffBackPayload(有效载荷)方法不起作用,因为有效载荷总是空的。 我以

    • 我有这个邮戳方法 我使用下面的JSON负载来提出我的帖子请求: 这将返回以下内容: “消息”:“JSON解析错误:无法反序列化超出起始\u数组标记的实例;嵌套异常为com.fasterxml.jackson.databind.exc.MismatchedInputException:无法反序列化超出起始\u数组标记的实例\n位于[源:(PushbackInputStream);行:1,列:1]“,

    • 我在Spring Boot中创建了一个JWT令牌,用于存储用户详细信息。当我使用Jwttokenutil时。getUsernameFromToken(authToken)[authToken是传递的令牌]方法我将数据集获取给Subject。类似地,我希望将包含其他用户详细信息的数据集获取到Payload。但是我不能得到它。 ======下面是我的令牌生成方法/代码:======== =======

    • 我们正在使用Spring Cloud Stream v2。2带有Kafka和Avro(本机编码器/解码器)。我们正在尝试根据负载的条件使用基于内容的路由。据我所知,根据Spring Cloud Stream文档,基于内容的路由只能在标头上实现,因为负载到达条件时没有经过类型转换过程。因此,除非条件基于字节格式,否则它将无法按预期工作。但是,我知道,当在本机模式下使用Avro时,会跳过消息头,并且不

    • 我正在用Spring集成编写一个过滤器。 在这个过滤器中,我检查了一组先决条件。如果不满足任何先决条件,我将需要更改消息有效载荷(甚至头),以添加用户要完成的操作集,以满足它,并通过discar通道将其返回给用户。 我可以使用服务激活器,但我认为过滤器在这种情况下更具描述性。 最干净的方法是什么? 这是一种伪代码: 谢谢

    • 当我想从另一个位于不同文件夹(如下所示)的特性文件中调用上述公共特性文件时,它不起作用: src/test/java/feature/tests/test.feat 我尝试了以下方法: 调用读取('feature/common/common.feature'),但它不起作用。