Spring webflux功能端点中存在多个异常处理程序

ekqde3dh  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(133)

我在Spring web flux项目中工作,我使用了函数端点而不是控制器注解,但我没有找到处理同一端点的多个异常的解决方案,这是我的代码:

@Override
protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
    return RouterFunctions.route(RequestPredicates.GET("/router/users/{id}"),this::renderException);
}

private Mono<ServerResponse> renderException(ServerRequest request) {

    Map<String, Object> error = this.getErrorAttributes(request, ErrorAttributeOptions.defaults());
    error.remove("status");
    error.remove("requestId");
    return ServerResponse.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON)
            .body(BodyInserters.fromValue(error));
}

对于端点/router/users/{id} i触发UserNotFoundException和UserException,我想为UserNotFoundException返回404,为UserException返回500,但我不知道如何在功能端点中执行此操作。有人可以指导我如何以正确的方式执行此操作,就像我们在rest控制器中使用@ExceptionHandler时所做的那样?

watbbzwu

watbbzwu1#

如果您只关心返回正确的代码,那么为自定义异常添加@ResponseStatus可能是最好的解决方案。

@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {

    // more methods...
    
    public UserNotFoundException(final String message) {
        super(message);
    }

}

但是,如果您想自己构建ServerResponse,请使用项目React器操作符,如switchIfEmpty()onErrorMap()等,它们可以按如下方式使用

Mono<ServerResponse> response() {
    return exampleService.getUser()
        .flatMap(user -> ServerResponse.ok().body(user, User.class))
        .switchIfEmpty(ServerResponse.notFound().build());
}

你可能想看看文档我需要哪个操作员?-处理错误

相关问题