0

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

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()

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

  • 当 Api 调用返回错误响应时 .transform(exetrnaldto to dto) 失败并且客户端得到 500
  • 我也想将错误响应 json 转换为我的 json
  • 我如何处理错误情况。

我的问题是;

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

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

4

1 回答 1

0

您的问题中没有特定的 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

于 2020-11-02T14:52:13.147 回答