为什么需要在生成的 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());
}
刚接触这个,有几点不明白:
- 有两个
Mono.empty()
,一个是结果,一个在then(Mono.empty())
里面,为什么要这样?
- 为什么不能 returns 一个?例如
return Mono.empty();
- 或者更好的是,也删除
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,新手可能会觉得很难开始写控制器
这是由 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());
}
刚接触这个,有几点不明白:
- 有两个
Mono.empty()
,一个是结果,一个在then(Mono.empty())
里面,为什么要这样? - 为什么不能 returns 一个?例如
return Mono.empty();
- 或者更好的是,也删除
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,新手可能会觉得很难开始写控制器