Spring 集成 Java 作为网关的 DSL IntegrationFlow 无法启动
Spring Integration Java DSL IntegrationFlow as Gateway fails to start
我在 Spring 启动应用程序中使用标准 Spring @RestController
调用 Spring 集成以启动消息流。据我了解,在此实例中,Spring 集成的挂钩是使用网关 - 使用 Java DSL 似乎有几种不同的方法可以完成此操作。
我目前有两种不同的工作方式:
- 通过定义一个标有
@MessagingGateway
注释的接口。
- 通过实例化一个
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 解析.
我在 Spring 启动应用程序中使用标准 Spring @RestController
调用 Spring 集成以启动消息流。据我了解,在此实例中,Spring 集成的挂钩是使用网关 - 使用 Java DSL 似乎有几种不同的方法可以完成此操作。
我目前有两种不同的工作方式:
- 通过定义一个标有
@MessagingGateway
注释的接口。 - 通过实例化一个
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 解析.