捕获Spring Integration DSL错误配置异常吗?

时间:2019-03-21 14:25:45

标签: java spring spring-integration spring-integration-dsl

使用DSL时是否可以捕获DestinationResolutionExceptionMessageDispatchingException?这些异常通常表示配置错误,但是我不确定如何配置流程以捕获这些异常并应用一些自定义逻辑?

@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();
  }
}

上面的示例抛出DestinationResolutionException,因为loggingFlow.transformer#0未正确初始化。有没有办法捕获此异常?

1 个答案:

答案 0 :(得分:1)

这些异常是运行时错误。我们确实无法在启动时确定配置错误。

ExpressionEvaluatingRequestHandlerAdvice是捕获此类运行时异常并进行一些分析工作的方法,您可以在端点配置的第二个参数中将其添加到transform(String::toUpperCase)配置中:

.<String, String>transform(String::toUpperCase, e-> e.advice(myExpressionEvaluatingRequestHandlerAdvice()))

请参阅参考手册中的有关此建议的更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/#message-handler-advice-chain

此外,您还需要记住transformer实际上是具有必需非空返回值的 request-reply 组件。因此,您确实不能仅为单向流配置transform()。当流中没有下一个通道或消息中没有replyChannel头时,它将引发异常。