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

split中的Spring集成验证

莫乐
2023-03-14

我正在尝试添加过滤器以丢弃流并在失败后继续执行主流并聚合拆分器。两个错误的预期类型

@Bean
public IntegrationFlow flow() {
     return f -> f
         .split(Orders.class, Orders::getItems)
         .enrich(e -> e.requestChannel("enrichChannel"))
         .filter(Order.class, c -> c.getId() > 10 ? true : false,
             e -> e.discardChannel(validationError()))
         .handle(new MyHandler())
         .transform(new MapToObjectTransformer(Order.class))
         .enrich(e -> e.requestChannel("transformChannel"))
         .filter(Order.class, c -> c.getTotal() > 100 ? true : false,
             e -> e.discardChannel(validationError())).handle( new transformer())
         .aggregate();
 }
            
@Bean
public IntegrationFlow validationErrorFlow() {
 return IntegrationFlows.from(validationError())
         .handle(new ValidationHandler())
         .get();
}

丢弃通道没有连接回主流以执行拆分中的下一项。

我可以写路线

更新1:

.handle(request.class, (p, h) -> validator.validate(p)
.gateway("filterFlow.input")
.handle(new MyHandler())
.enrich(...)
.handle(...)
.enrich(...)
.handle(...)
.enrich(...)
.handle(...)
.aggregate();



@Bean
    public IntegrationFlow filterFlow() {
        return f -> f
                .filter(response.class, c -> c.isValidationStatus(), df -> df.discardFlow
                        (flow -> flow.handle(Message.class, (p, h) -> p.getPayload())));
    }

网关能够拦截请求,但执行的流. hand(new MyHandler())而不是拆分()中的下一项

更新2:(回答)来自Artem

.handle(request.class, (p, h) -> validator.validate(p))
    .filter(response.class,p -> p.isValidationStatus(), f -> f.discardChannel("aggregatorChannel"))
    .handle(new MyHandler())
    .enrich(...)
    .handle(...)
    .enrich(...)
    .handle(...)
    .enrich(...)
    .handle(...)
    .channel("aggregatorChannel")
    .aggregate();

这将执行条件跳过

共有1个答案

周子平
2023-03-14

discard通道没有连接回主流以执行拆分中的下一项。

这是真的。它就是这样设计的。在大多数情况下,丢弃流类似于JMS中的死信队列。所以,这是短的单向分支。

如果您真的想回到主流,您应该考虑在流定义中使用命名通道。我的意思是在补偿(丢弃)流后您想回来的地方:

.filter(Order.class, c -> c.getId() > 10 ? true : false,
                    e -> e.discardFlow(sf -> sf
                            .gateway(validationError())
                            .channel("myHandleChannel")))
            .channel("myHandleChannel")
            .handle(new MyHandler())

我使用gateway(),因为我们需要discard流的回复才能继续处理。我们需要它。通道(“myHandleChannel”)位于子流的末尾,因为丢弃流是一个分支。

另一种方法可以通过实现。gateway()在主流程上:

.gateway("filterFlow.input")
.handle(new MyHandler())

...

@Bean
public IntegrationFlow filterFlow() {
    return f -> f
            .filter(Order.class, c -> c.getId() > 10 ? true : false,
                    e -> e.discardChannel(validationError()));
}

我们向discardChannel发送相同的请求消息,因此上述网关的适当复制Channel标头仍然存在。您只需要确保从生成正确的回复。句柄(new ValidationHandler())

 类似资料:
  • 我有一个windows服务器,我需要从它使用sftp将文件传输到另一个服务器。目标服务器可能是Linux或windows box。 我的问题是,我必须在我的windows机器上依赖第三方sftp服务器软件,还是spring集成解决了这个问题? 我应该如何在windows box上生成公钥和私钥对?

  • 我知道这方面有几个问题...但我仍然无法使其工作。我有一个Spring应用程序,我正在尝试为其编写集成测试。我尝试使用xml文件设置应用程序上下文(或多或少与我用于应用程序的xml文件相同)。出现的问题如下: > 我指定了正确的路径,然后它开始抱怨在类路径上找不到资源。我已经复制了test/resources文件夹中缺少的文件。 现在,它无法加载应用程序上下文并出现以下错误:没有找到[javax.

  • 我正在将SpringBoot 2.0与Spring Integr5.0.3一起使用,并且我的HTTP. in边界网关有问题。我的目标是验证发布到网关的JSON,因为请求pojo由强制字段组成。 有没有一种简单的方法来验证pojo中的字段是否已设置?我已经测试过的是使用@NotNull-SpringValidation,但它似乎不受Spring集成的支持。 你好smoothny

  • 请告诉我是否有方法覆盖spring integration XSD validator引发的默认soap错误。默认情况下,生成的故障是客户端故障,但我想将其更改为自定义故障代码。是AbstractSoapFaultDefinitionExceptionResolver。getFaultDefinition()是执行此操作的正确位置?

  • 在我们的Spring web应用程序中,我们使用Spring bean概要文件区分三种场景:开发、集成和生产。我们使用它们连接到不同的数据库或设置其他常量。 我可以使用使它在本地运行,但这是硬编码的,会导致我们的测试在构建服务器上失败。 我还尝试使用,希望它能以某种方式从Maven导入属性,但这不起作用。 另一个注意事项是,我们还需要配置代码,以便开发人员可以运行web应用程序,然后使用Intel

  • 问题内容: 有谁知道如何整合spring mvc和elastisearch?我想实现一个类似于一般网站的网页(谷歌,雅虎searcg引擎),是否有任何教程或示例代码? 问题答案: 检出Spring Data Elasticsearch 项目。 这是一个示例应用程序。