我在Spring Boot应用程序中使用标准Spring @RestController
,该应用程序调用Spring Integration以启动消息传递流。据我了解,在这种情况下,Spring Integration的主要目的是使用网关-使用Java DSL似乎有几种不同的方法。
我目前有两种不同的工作方式:
@MessagingGateway
批注的接口。 new GatewayProxyFactoryBean(Consumer.class)
并设置频道。 这两种方法都有些笨拙-似乎存在第三种更简洁的方法,它使您不必注释或手动构造GatewayProxyFactoryBean,而只需使用带有bean名称的内置Functional接口。从文档中:
@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.
我在这里想念东西吗?
谢谢。
答案 0 :(得分:0)
我做了这个申请
@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);
}
}
请注意@Lazy
自动装配属性上的errorRecovererFlowGateway
批注。关于此注释的文档说:
如果要影响某些bean的启动创建顺序,请考虑将其中一些声明为
@Lazy
(用于首次访问而不是启动时创建)或声明为@DependsOn
某些其他bean(确保在当前Bean之前创建特定的其他Bean(超出后者的直接依赖项所暗示的范围之外)。
我认为我们需要在《 Spring Integration参考手册》中阐明,IntegrationFlow
解析期间创建的bean不能照原样注入,但是应该考虑使用@Lazy
批注来推迟bean解析。