首页 > 解决方案 > Spring 集成 Java DSL 入站和出站错误处理

问题描述

我正在尝试构建一个集成解决方案

IntegrationFlows
  .from(inBoundGateway)
  .enrichHeaders(enrichHeaders())
  .transform(dto to externaldto)
  .handle(outBoundGateway, advice -> advice.advice(retryAdvice()))
  .transform(exetrnaldto to dto)
  .get()

  @Bean
  RequestHandlerRetryAdvice rhra
  rhra.setRecoveryCalBack(errorMessgaeRecoverer());

  @Bean
  ErrorMessageSendingRecoverer errorMessgaeRecoverer

我的出站网关定义为

Http.outboundGateway(uri, resttemplate)
 ...
 .get()


new RestTemplate(requestFactory)

requestFactory 在哪里

TrustStratgey ts = new TrustStratgey(){
 public boolean isTrusted(...){
   return true;
 }
}
SSLContext context = SSLContexts,custom().loaddTrustMaterials(null, ts);
SSLContextFactory cf = new SSLContextFactory(context, new NoopHostnameVerifier());
HttpClientBuilder clientBuilder ..
clientBuilder.setSSLSocketFactory()

快乐的道路工作正常,我面临的问题是不那么快乐的道路。

我的问题是;

  1. 如何处理错误。
  2. 在错误情况下如何停止流不转换
  3. 如何从出站向客户端发送状态码作为响应(这很重要)
  4. 如何处理典型的@Controller Advice @ErrorHandler 机制或类似的错误。

希望Garry能看到这篇文章,找不到任何答案,我翻了很多书和论坛,感觉 Java DSL 还没有被广泛使用或评论。

标签: spring-integrationspring-integration-dslspring-integration-http

解决方案


您的问题中没有特定的 Spring Integration Java DSL。它实际上更多地是关于如何在服务器端(MVC - HttpInboundGateway)和客户端 -RestTemplate以及 HttpOutboundGateway 处理 HTTP 错误。Java DSL 只是现有技术和解决方案的语法糖。

所以,这@Controller Advice @ErrorHandler是一个 MVC,服务器端。您绝对可以使其与 HttpInboundGateway 一起使用,但对于客户端 REST 调用来说,这确实是错误的方向。

看起来您想为您的 .handle(outBoundGateway). 考虑ExpressionEvaluatingRequestHandlerAdvice与 that 一起使用retryAdvice。因此,您将能够使用它failureChannel来处理异常并将其分别转换为所需的 JSON。

在文档中查看更多信息:https ://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#expression-advice


推荐阅读