【问题标题】:Spring JDBC Outbound Gateway To Return Original PayloadSpring JDBC 出站网关返回原始有效负载
【发布时间】:2020-04-27 12:29:03
【问题描述】:

使用JdbcOutboundGateway,我如何获得原始有效载荷的回复?

目前,响应负载为{UPDATED=1}。参考文档(Spring 5.2.x)和源代码似乎都没有提供替代方案。

我应该扩展类并覆盖handleRequestMessage 以返回原始有效负载吗?方法是protected,它对我来说是对extend 的邀请,或者在Spring Integration 中有一个首选的“模式”来处理下一个@ServiceActivator 中的{UPDATED=1},并以某种方式恢复有效负载。

如果有人好心回答,请举一个使用配置/注释而不是 XML 或 DSL 的示例。

编辑

我最终做了类似下面的事情。这样做是否可取?我是否因为不使用“integration-jdbc”方法而遗漏了什么?

@Bean
@ServiceActivator(inputChannel="myIn", outputChannel="myOut")
public GenericHandler<String> saveToDb(@Autowired MyRepository myRepo) {
  return (payload, header) -> {
    MyClass x = (MyClass) headers.get("MyClassObject")
    myRepo.save(x);
    return payload;
  };
}

【问题讨论】:

  • 任何不相关的 cmets 为什么不是 XML 或 DSL?
  • @Artem 主要是从可读性和可能无知的角度来看。我从第 5 版开始使用 Spring,并被教导使用注释。我被告知 XML 是“旧式”。然后我开始使用Integration,它的文档主要是面向XML 的。我认为这只是向下 Spring 4 的宿醉/向后兼容性。所以我想让我的代码尽可能地像“Java”一样。至于 DSL,一旦你进入大流程,它就会变得非常不可读。 .
  • 这是不正确的假设:XML 配置仍然受支持,甚至可以与注释配置结合使用。但是,是的,我同意:如果一切都是 Java 和注释,最好不要用 XML 来打扰自己。那么,另一边的 Java DSL 有什么问题呢?
  • @Artem 在阅读 XML 配置时是否可以遵循一种模式?如果我查看 XML 配置;对我未经训练的眼睛来说,似乎与带注释的版本没有关联。以这个 JdbcOutboundGateway 为例。我以为是@Gateway,但我看到你的一个要点,它使用了@ServiceActivator
  • @ArtemBilan 将我的代码重写为 DSL,我现在是 DSL 转换者 :-) 我需要更少的 @Beans 来完成这项工作,因为我可以组合许多动作。我不必考虑需要哪个注释(例如 @ServiceActivator @Transformer 等)。 IDE 中的自动完成功能使编程更加直观。 (感谢您的出色工作和@GaryRussell)

标签: java spring spring-boot spring-integration spring-integration-jdbc


【解决方案1】:

最简单的解决方案是在网关之前添加一个标头丰富器,并将有效负载复制到标头中。

【讨论】:

  • 另一种解决方案类似于PublishSubscribeChannel,其中JdbcMessageHandler 作为第一个订阅者,您的@ServiceActivator 作为另一个订阅者。这样,在 JdbcMessageHandler 完成其工作之前,您的原始有效负载逻辑不会被调用。
  • @Gary-Russell - 感谢您的回复。我用到目前为止所做的事情编辑了我的问题。它是合法的还是我在 JDBC 处理程序中传递了一些“魔法”?
猜你喜欢
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2018-10-11
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多