Java 捕获Spring集成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) {

使用DSL时是否有方法捕获
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(…)
方法,我不必为它们中的每一个注册建议?这可能需要一个新的问题?不,不是。这样的建议是针对每个端点的。整个流只是一个逻辑容器,在运行时,流与其声明的端点之间的交互没有任何关系。