Orc*_*lev 5 java spring project-reactor spring-webflux
我正在尝试使用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());
}
Run Code Online (Sandbox Code Playgroud)
我希望在调用关联的端点时得到404响应。相反,我看到的是带有日志消息的500响应,表明Spring认为在请求处理期间存在未处理的异常。
当我在onErrorResume内部断点时,我看到有两个处理程序正在注册,一个是我在上述方法中注册的,另一个是Spring(在之中RouterFunctions.toHttpHandler)为的实例注册的ResponseStatusException。然后,在处理请求期间,我仅看到第二个处理程序(由Spring注册的处理程序)被调用,与抛出的异常不匹配,然后进入根级处理程序。
据我所知,Spring正在路由器级别覆盖onErrorResume,从而阻止了我在Handler中注册的那个错误。这是预期的行为吗?有没有更好的方法来完成我正在尝试的工作?
该框架确实具有一个“包罗万象”的功能,随后.body(...)可以调用任何内容。这是设计使然,我认为将很难避免。
我看到3个解决方案:
像这样:
return Mono.fromCallable(this::trigger)
.flatMap(s -> ServerResponse.ok()
.contentType(MediaType.TEXT_PLAIN)
.syncBody(s))
.onErrorResume(MinimalExampleException.class,
e -> ServerResponse.notFound().build());
Run Code Online (Sandbox Code Playgroud)
ResponseStatusException您可以将放到与(在正文调用内部)onErrorResume相同的级别,以通过错误单声道fromCallable()将特定错误转换为ResponseStatusException:
Mono.fromCallable(this::trigger)
.onErrorResume(MinimalExampleException.class,
e->Mono.error(new ResponseStatusException(404, "reason message", e)))
Run Code Online (Sandbox Code Playgroud)
您应该能够使用注释方法@ExceptionHandler来处理您的特定异常。
| 归档时间: |
|
| 查看次数: |
3269 次 |
| 最近记录: |