当前位置: 首页 > 面试题库 >

在spring-webflux中处理错误的正确方法是什么

卞成荫
2023-03-14
问题内容

我一直在使用spring-webflux进行一些研究,我想了解使用路由器功能处理错误的正确方法。

我创建了一个小项目来测试几个场景,并且我希望获得有关它的反馈,并查看其他人在做什么。

到目前为止,我在做什么。

提供以下路由功能:

@Component
public class HelloRouter {
    @Bean
    RouterFunction<?> helloRouterFunction() {
        HelloHandler handler = new HelloHandler();
        ErrorHandler error = new ErrorHandler();

        return nest(path("/hello"),
                nest(accept(APPLICATION_JSON),
                        route(GET("/"), handler::defaultHello)
                                .andRoute(POST("/"), handler::postHello)
                                .andRoute(GET("/{name}"), handler::getHello)
                )).andOther(route(RequestPredicates.all(), error::notFound));
    }
}

我已经在我的处理程序上执行

class HelloHandler {

    private ErrorHandler error;

    private static final String DEFAULT_VALUE = "world";

    HelloHandler() {
        error = new ErrorHandler();
    }

    private Mono<ServerResponse> getResponse(String value) {
        if (value.equals("")) {
            return Mono.error(new InvalidParametersException("bad parameters"));
        }
        return ServerResponse.ok().body(Mono.just(new HelloResponse(value)), HelloResponse.class);
    }

    Mono<ServerResponse> defaultHello(ServerRequest request) {
        return getResponse(DEFAULT_VALUE);
    }

    Mono<ServerResponse> getHello(ServerRequest request) {
        return getResponse(request.pathVariable("name"));
    }

    Mono<ServerResponse> postHello(ServerRequest request) {
        return request.bodyToMono(HelloRequest.class).flatMap(helloRequest -> getResponse(helloRequest.getName()))
                .onErrorResume(error::badRequest);
    }
}

它们是我的错误处理程序:

class ErrorHandler {

    private static Logger logger = LoggerFactory.getLogger(ErrorHandler.class);

    private static BiFunction<HttpStatus,String,Mono<ServerResponse>> response =
    (status,value)-> ServerResponse.status(status).body(Mono.just(new ErrorResponse(value)),
            ErrorResponse.class);

    Mono<ServerResponse> notFound(ServerRequest request){
        return response.apply(HttpStatus.NOT_FOUND, "not found");
    }

    Mono<ServerResponse> badRequest(Throwable error){
        logger.error("error raised", error);
        return response.apply(HttpStatus.BAD_REQUEST, error.getMessage());
    }
}

这是完整的示例存储库:

https://github.com/LearningByExample/reactive-ms-
example


问题答案:

Spring 5提供了一个WebHandler,在JavaDoc中,有一行:

使用HttpWebHandlerAdapter使WebHandler适应HttpHandler。WebHttpHandlerBuilder提供了一种方便的方法,同时还可以选择配置一个或多个过滤器和/或异常处理程序。

当前,官方文档建议我们在启动任何服务器之前将路由器功能包装到HttpHandler中:

HttpHandler httpHandler = RouterFunctions.toHttpHandler(routerFunction);

借助WebHttpHandlerBuilder,我们可以配置自定义异常处理程序:

HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(toHttpHandler(routerFunction))
  .prependExceptionHandler((serverWebExchange, exception) -> {

      /* custom handling goes here */
      return null;

  }).build();


 类似资料:
  • 所以,我想实现一个非常简单的输出。 我有与字段成功,消息和列表数据响应类。 和请求类 null null 我试过很多方法,但最后都没能做到。

  • 我正在使用带有knex javascript库的postgres来构建我的sql查询。我想要处理所有从postgres服务器抛出的错误,所以我想要这样做的方式是通过检查抛出错误的类型。 有没有办法处理这样的错误?

  • 我是Spring gateway cloud(Spring Reactor)的新手。我想实现聚合层,它将从两个微服务(如RealAPI gateway)下载数据。据我所知,在Spring Cloud Gateway中,它需要以反应式方式实现。 我发现RouterFunction可以创建一个网关endpoint来实现POST到其中一个微服务。它可以工作,但当微服务返回BAD_状态或其他时,我的spr

  • 我想在以下条件下抛出自定义异常: > 如果我得到了json格式的正确错误响应,我想反序列化它,并在onStatus()中抛出名为CommonException的异常 如果作为响应的一部分接收HTML内容或反序列化未成功执行,则我希望抛出GenericeException,这是我在onErrorMap()中创建的 在抛出GenericException时,我希望将从下游响应获得的相同HttpStat

  • SI5+支持,这意味着我们现在可以构建一个反应消息传递系统。然而,这也意味着设计已经考虑周全,通常的错误处理方法不起作用。在反应流中,消息是(),它不会引发异常,但会发出错误通知。因此,消息上设置的错误通道标头是无用的,因为SI不知道导致了错误。考虑以下代码: 上面的代码片段中缺少的是将异常发送到消息上配置的错误通道。我们怎么能这么做?

  • 问题内容: 在PHP系统中,我有一个常见的MVC情况:从包含的数据中接收请求。现在,我有三种方法来处理数据: a)仅调用和处理数据。 b)在变换的数据转换成变量,并将它们传递到。 c)将数据转换为的域对象,并将该对象仅传递给。 目前,我正在使用选项A,但是我认为这是错误的,因此我正在考虑使用选项C。 因此,根据MVC,处理数据的正确方法是什么? 编辑 目前,我没有使用任何MVC框架。 编辑2 通常