【发布时间】:2021-08-03 13:49:51
【问题描述】:
我正在尝试使用WebFlux.outboundGateway 调用上的子流程来制定基于WebClient 的处理和丰富方法。
我的目的是处理远程端发生 HTTP/404 的情况。在这种情况下,我将使用可以在下游处理并适当路由的已知文档来处理错误。
.enrich( e ->
e.requestSubFlow(
sf -> sf.handle(
WebFlux.outboundGateway("http://example.com/entity/name/{entityName}")
.uriVariable("entityName", "payload")
.httpMethod(HttpMethod.GET)
.expectedResponseType(String.class),
ec -> ec.customizeMonoReply(
(message,mono) ->
mono.onErrorResume(
WebClientResponseException.NotFound.class,
Mono.just("{ \"id\": -1, \"name\": null }")
.flatMap(s ->
ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(s)
)
)
)
)
)
.headerExpression("result", "payload")
)
我得到的是类似于以下的编译错误:
The method onErrorResume(Class<E>, Function<? super E,? extends Mono<? extends capture#3-of ?>>) in the type Mono<capture#3-of ?> is not applicable for the arguments (Class<WebClientResponseException.NotFound>, Mono<Object>)
我什至不知道我是否正确地处理了这个问题。任何建议将不胜感激。
为了帮助解决这个问题,我发布了整个代码 https://github.com/djgraff209/so68637283。
编辑 8/6:
感谢@artem-bilan 对此的反馈。第一点是onErrorResume 的第二个参数不是函数。我已经更正了。
接下来,异常匹配结果不正确。一个通用的WebClientResponseException 被抛出,而不是一个更具体的WebClientResponseException.NotFound,这是我所希望的。
我将逻辑更新如下。此代码可在引用的 GitHub 项目中找到。
ec -> ec.customizeMonoReply(
(Message<?> message, Mono<?> mono) ->
mono.onErrorResume(
WebClientResponseException.class,
ex1 -> {
Mono<?> exReturn = mono;
if( ex1.getStatusCode() == HttpStatus.NOT_FOUND ) {
exReturn = Mono.just(defaultPayload);
}
return (Mono)exReturn;
}
)
)
虽然这可行,但它并不像我想要的那样干净。我不喜欢在其中放置一个 if 条件来通过 HttpStatus 解析异常类型,而不仅仅是将其解析为特定的类。
这可能是一个很好的错误/增强候选者。
已提交#3610
【问题讨论】:
标签: spring-integration spring-webflux spring-integration-dsl