为什么需要在生成的 Open API Spring 代码的默认实现中然后 Mono.empty()?

Why need to then Mono.empty() in the default implementation of generated Open API Spring code?

这是由 openapi-generator-maven-plugin 使用 Spring 作为库启动生成的 API 的默认实现:

default Mono<ResponseEntity<Void>> testAPI(
    @Parameter(hidden = true) final ServerWebExchange exchange
) {
    Mono<Void> result = Mono.empty();
    exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED);
    return result.then(Mono.empty());
}

刚接触这个,有几点不明白:

  1. 有两个Mono.empty(),一个是结果,一个在then(Mono.empty())里面,为什么要这样?
  2. 为什么不能 returns 一个?例如return Mono.empty();
  3. 或者更好的是,也删除 exchange 中的传递并执行:
return Mono.just(ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build());

默认实现更像是一个模板,提示您如何完成此 API 控制器。对于 API 控制器,通常您需要至少分两步创建响应:首先从某个来源获取数据,然后使其成为有效响应。模板代码可以为您提供编写此类代码的起点。例如,我可以使用模板编写以下代码:

public class UsersApiController implements UsersApi {
    @Override
    public Mono<ResponseEntity<String>> usersGet(
            @Parameter(hidden = true) final ServerWebExchange exchange
    ) {
        var client = WebClient.create("http://calapi.inadiutorium.cz/");
        Mono<String> result = client.get().uri("/api/v0/en/calendars/general-en/today").retrieve().bodyToMono(String.class);
        return result.map(rep -> ResponseEntity.status(HttpStatus.OK).body(rep));
    }
}

第一个 Mono.empty 成为从另一个 API 获取数据的 WebClient,第二个 Mono.empty 被映射操作替换,将 API 结果转换为响应实体对象。如果生成器只生成一个Mono.empty,新手可能会觉得很难开始写控制器