首页 > 解决方案 > 如何将方法作为带参数的函数传递?

问题描述

spring-webflux用来调用外部网络服务异步,例如:

String param1;
int param2;

webClient.send(...)
          .exchange()
          .doOnSuccess(rsp -> processResponse(rsp))
          .onErrorMap(ex -> processException(ex, param1, param2));

现在我想将实际发送重构为更通用的方法,调用者应该为成功+错误函数提供一个参数。但是怎么做?

public Mono send(Function success, Function error) {
    return webClient.send(...)
              .exchange()
              .doOnSuccess(success)
              .onErrorMap(error);
}

问题:我现在如何将函数传递给我的泛型方法?

它必须类似于下面的伪代码,但我究竟要如何编写函数呢?

public void caller() {
     String param1;
     int param2;

     send(
            rsp -> processResponse(rsp),
            ex -> processException(ex, param1, param2)
     );
}

标签: javaspringspring-webfluxproject-reactor

解决方案


如果您确实想使用onErrorMap()(将一个异常映射到另一个),那么:

public Mono<ClientResponse> send(Consumer<? super ClientResponse> success, Function<? super Throwable, ? extends Throwable> error) {
  return webClient()
      .get()
      .uri("http://example.com/")
      .exchange()
      .doOnSuccess(success)
      .onErrorMap(error);
}

send(cr -> processResponse(cr), ex -> mapToAnotherException(ex));

...但听起来你想实际添加一个错误的副作用,doOnError()而不是:

public Mono<ClientResponse> send(Consumer<? super ClientResponse> success, Consumer<? super Throwable> error) {
  return webClient()
      .get()
      .uri("http://example.com/")
      .exchange()
      .doOnSuccess(success)
      .doOnError(error);
}

send(cr -> processResponse(cr), ex -> processException(ex));

但是请注意,exchange()现在已弃用 - 您现在通常会使用它,提供一个从客户端响应exchangeToMono()返回 a 的函数。Mono<Foo>(如果你真的想像以前一样返回 a Mono<ClientResponse>,你可以这样做.exchangeToMono(Mono::just)。)


推荐阅读