我正在尝试使用 WebFlux,但我看到了一个我不太理解的行为,我怀疑这是 WebFlux 或 Reactor 中的错误,但我需要确认。
我试图创建一个最小可重现的案例,其中包含一个非常简单的 HandlerFunction,它尝试返回 200 响应,但在创建主体期间抛出异常,然后尝试使用 onErrorResume 来代替返回 404 响应。
处理程序如下所示:
public Mono<ServerResponse> reproduce(ServerRequest request){
return ServerResponse.ok()
.contentType(APPLICATION_JSON)
.body(Mono.fromCallable(this::trigger),String.class)
.onErrorResume(MinimalExampleException.class,e->ServerResponse.notFound().build());
}
我希望在调用关联的端点时会得到 404 响应。相反,我看到的是带有日志消息的 500 响应,表明 Spring 认为在请求处理期间存在未处理的异常。
当我在 onErrorResume 内部设置断点时,我看到两个处理程序正在注册,一个是我在上面的方法中注册的,另一个是 Spring (在内部RouterFunctions.toHttpHandler
)为ResponseStatusException
. 然后在处理请求期间,我只看到第二个处理程序(由 Spring 注册的那个)被调用,与抛出的异常不匹配,然后落入根级处理程序。
据我所知,Spring 正在路由器级别覆盖 onErrorResume,以防止调用我在 Handler 中注册的那个。这是预期的行为吗?有没有更好的方法来完成我正在尝试的事情?