Java 捕获Spring集成DSL错误配置异常?
使用DSL时是否有方法捕获Java 捕获Spring集成DSL错误配置异常?,java,spring,spring-integration,spring-integration-dsl,Java,Spring,Spring Integration,Spring Integration Dsl,使用DSL时是否有方法捕获DestinationResolutionException和MessageDispatchingException?这些异常通常表示配置错误,但我不确定如何配置流以捕获这些异常并应用一些自定义逻辑 @SpringBootApplication public class IntegrationMisconfigurationExampleApplication { public static void main(final String[] args) {
DestinationResolutionException
和MessageDispatchingException
?这些异常通常表示配置错误,但我不确定如何配置流以捕获这些异常并应用一些自定义逻辑
@SpringBootApplication
public class IntegrationMisconfigurationExampleApplication {
public static void main(final String[] args) {
SpringApplication.run(IntegrationMisconfigurationExampleApplication.class, args);
}
@Bean
public IntegrationFlow loggingFlow() {
return IntegrationFlows.from("input")
.<String, String>transform(String::toUpperCase)
// .nullChannel();
.get();
}
@Bean
public CommandLineRunner demo() {
return args -> {
final MessagingTemplate template = messagingTemplate();
template.convertAndSend("input", "abc");
};
}
@Bean
public MessagingTemplate messagingTemplate() {
return new MessagingTemplate();
}
}
@springboot应用程序
公共类集成错误配置示例应用程序{
公共静态void main(最终字符串[]args){
run(IntegrationMisconfigurationExampleApplication.class,args);
}
@豆子
公共集成流日志流(){
返回IntegrationFlows.from(“输入”)
.transform(字符串::toUpperCase)
//.nullChannel();
.get();
}
@豆子
公共CommandLineRunner演示(){
返回参数->{
最终MessagingTemplate=MessagingTemplate();
模板转换发送(“输入”、“abc”);
};
}
@豆子
公共MessagingTemplate MessagingTemplate(){
返回新的MessagingTemplate();
}
}
上面的示例引发了一个DestinationResolutionException
,因为loggingFlow.transformer#0
未正确初始化。是否有方法捕获此异常 这些异常是运行时错误。我们真的无法确定启动时的错误配置
捕获这样的运行时异常并进行一些分析工作的方法是使用expressionEvaluationRequestHandlerAdvice
,您可以将其添加到端点配置的第二个参数中的转换(String::toUpperCase)
配置中:
.<String, String>transform(String::toUpperCase, e-> e.advice(myExpressionEvaluatingRequestHandlerAdvice()))
.transform(String::toUpperCase,e->e.advice(myExpressionEvaluatingRequestHandlerAdvice())
请参阅参考手册中有关此建议的更多信息:
您还需要记住,
transformer
实际上是一个具有所需非空返回值的请求-应答组件。因此,您确实无法仅为单向流配置transform()
。当流中没有下一个通道或消息中没有replyChannel
头时,它将抛出异常。我应该更好地解释我试图做的事情。。。我故意错误配置了transformer,因为这是我知道如何生成此异常的最简单方法。我也知道你无法确定,也不希望你确定,我真的在寻找e.advice
:)我试着寻找e.errorChannel(…)
或类似的东西,但找不到,没有考虑使用建议,谢谢!errorChannel()
仅适用于网关或入站通道适配器。它仍然像请求消息中的头。在该入站组件上处理此类错误。但是如果您直接发送消息,您将在调用者中得到一个异常。在当前组件中本地处理它的唯一方法是通过所提到的通知。还有一件事,是否可以注册完整流的通知,而不仅仅是一个组件?因此,如果有多个.transform(…)
方法,我不必为它们中的每一个注册建议?这可能需要一个新的问题?不,不是。这样的建议是针对每个端点的。整个流只是一个逻辑容器,在运行时,流与其声明的端点之间的交互没有任何关系。