Spring 集成 Java 作为网关的 DSL IntegrationFlow 无法启动

Spring Integration Java DSL IntegrationFlow as Gateway fails to start

我在 Spring 启动应用程序中使用标准 Spring @RestController 调用 Spring 集成以启动消息流。据我了解,在此实例中,Spring 集成的挂钩是使用网关 - 使用 Java DSL 似乎有几种不同的方法可以完成此操作。

我目前有两种不同的工作方式:

  1. 通过定义一个标有 @MessagingGateway 注释的接口。
  2. 通过实例化一个 new GatewayProxyFactoryBean(Consumer.class) 并设置频道。

这两种方法都感觉有点笨拙 - 似乎有第三种更简洁的方法,它允许您不必注释或手动构造 GatewayProxyFactoryBean,只需使用带有 bean 名称的内置函数式接口.来自文档:

@Bean
public IntegrationFlow errorRecovererFlow() {
    return IntegrationFlows.from(Function.class, "errorRecovererFunction")
            .handle((GenericHandler<?>) (p, h) -> {
                throw new RuntimeException("intentional");
            }, e -> e.advice(null))
            .get();
}


@Autowired
@Qualifier("errorRecovererFunction")
private Function<String, String> errorRecovererFlowGateway;

但是,bean errorRecovererFunction 似乎没有注册,应用程序无法启动。

Field errorRecovererFlowGateway in MyController required a bean of type 'java.util.function.Function' that could not be found.

我是不是漏掉了什么?

提前致谢。

我做了这个申请:

@SpringBootApplication
@RestController
public class So52778707Application {

    @Autowired
    @Qualifier("errorRecovererFunction")
    @Lazy
    private Function<String, String> errorRecovererFlowGateway;

    @GetMapping("/errorRecoverer")
    public String getFromIntegrationGateway(@RequestParam("param") String param) {
        return this.errorRecovererFlowGateway.apply(param);
    }

    @Bean
    public IntegrationFlow errorRecovererFlow() {
        return IntegrationFlows.from(Function.class, "errorRecovererFunction")
                .handle((p, h) -> {
                    throw new RuntimeException("intentional");
                })
                .get();
    }

    public static void main(String[] args) {
        SpringApplication.run(So52778707Application.class, args);
    }

}

注意 errorRecovererFlowGateway 自动装配 属性 上的 @Lazy 注释。关于此注释的文档说:

If you want to influence the startup creation order of certain beans, consider declaring some of them as @Lazy (for creation on first access instead of on startup) or as @DependsOn certain other beans (making sure that specific other beans are created before the current bean, beyond what the latter’s direct dependencies imply).

我认为我们需要在 Spring 集成参考手册中澄清,在 IntegrationFlow 解析期间创建的 beans 不能按原样注入,但应考虑 @Lazy 注释用于延迟 bean 解析.