如何使用自定义错误通道来生成自定义错误响应?
How to use custom error channel to produce custom error response?
我正在尝试使用 Spring 集成构建一个简单的 API。对于 API 中抛出的任何异常或错误,我想向客户端提供自定义错误响应。我正在尝试以下流程结构:
@Bean
public IntegrationFlow mainFlow() {
return IntegrationFlows.from(WebFlux.inboundGateway(path)
.errorChannel(customErrorChannel())
)
.enrichHeaders(h -> h.header(MessageHeaders.ERROR_CHANNEL, "customErrorChannel"))
.transform(p -> {
if(<some validation fails>)
throw new RuntimeException("Error!");
return "Ok Response";
})
.get();
}
@Bean
public PublishSubscribeChannel customErrorChannel() {
return MessageChannels.publishSubscribe().get();
}
@Bean
public IntegrationFlow errorFlow() {
return IntegrationFlows.from("customErrorChannel")
.transform(p -> {
return "Error Response";
})
.get();
}
对于成功案例,"Ok Response" 提供给客户。但是当在转换器中抛出异常时,提供的响应是来自具有堆栈跟踪的框架的默认错误响应。如何使用 errorFlow
生成异常的最终响应?
我可以使用 CustomErrorWebExceptionHandler
作为全局异常处理程序,但这不是我的意图。
事实证明,.errorChannel(customErrorChannel())
在像 WebFlux.inboundGateway()
这样的响应式通道适配器的情况下无法使用。请提出 GH 问题,我们会考虑我们可以做什么以及如何做。
作为解决方法,我建议您查看 ExpressionEvaluatingRequestHandlerAdvice
的 transform()
:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#message-handler-advice-chain。
这样您将捕获转换器中的所有错误,并将它们发送到您的 customErrorChannel
进行处理。
不过 .enrichHeaders(h -> h.header(MessageHeaders.ERROR_CHANNEL, "customErrorChannel"))
没有理由。 .errorChannel(customErrorChannel())
应该足够了。但是当我们已经有了修复时。
更新
事实证明,作为解决方法,您可以在 transform()
之前添加 .channel(MessageChannels.flux())
,错误应该通过 errorChannel
.
处理
我正在尝试使用 Spring 集成构建一个简单的 API。对于 API 中抛出的任何异常或错误,我想向客户端提供自定义错误响应。我正在尝试以下流程结构:
@Bean
public IntegrationFlow mainFlow() {
return IntegrationFlows.from(WebFlux.inboundGateway(path)
.errorChannel(customErrorChannel())
)
.enrichHeaders(h -> h.header(MessageHeaders.ERROR_CHANNEL, "customErrorChannel"))
.transform(p -> {
if(<some validation fails>)
throw new RuntimeException("Error!");
return "Ok Response";
})
.get();
}
@Bean
public PublishSubscribeChannel customErrorChannel() {
return MessageChannels.publishSubscribe().get();
}
@Bean
public IntegrationFlow errorFlow() {
return IntegrationFlows.from("customErrorChannel")
.transform(p -> {
return "Error Response";
})
.get();
}
对于成功案例,"Ok Response" 提供给客户。但是当在转换器中抛出异常时,提供的响应是来自具有堆栈跟踪的框架的默认错误响应。如何使用 errorFlow
生成异常的最终响应?
我可以使用 CustomErrorWebExceptionHandler
作为全局异常处理程序,但这不是我的意图。
事实证明,.errorChannel(customErrorChannel())
在像 WebFlux.inboundGateway()
这样的响应式通道适配器的情况下无法使用。请提出 GH 问题,我们会考虑我们可以做什么以及如何做。
作为解决方法,我建议您查看 ExpressionEvaluatingRequestHandlerAdvice
的 transform()
:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#message-handler-advice-chain。
这样您将捕获转换器中的所有错误,并将它们发送到您的 customErrorChannel
进行处理。
不过 .enrichHeaders(h -> h.header(MessageHeaders.ERROR_CHANNEL, "customErrorChannel"))
没有理由。 .errorChannel(customErrorChannel())
应该足够了。但是当我们已经有了修复时。
更新
事实证明,作为解决方法,您可以在 transform()
之前添加 .channel(MessageChannels.flux())
,错误应该通过 errorChannel
.