内容目录
Spring 提供了响应式编程的实现 WebFlux
来构建异步的、非堵塞的、事件驱动的服务,而且在伸缩性方面表现非常好。
我们经常会写出如下的代码来提供一个api接口:
@PostMapping("/demo")
public Mono<ApiRsp> demo(RequestForm form, BindingResult errors) {
return Mono.justOrEmpty(errors)
.filter(Errors::hasErrors)
.map(err -> ApiRsp.error(err.toString()))
.switchIfEmpty(doRequest(form));
}
这段代码看起来没什么问题,但是很可能会响应空。比如:
POST http://localhost:8080/demo
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 0
<Response body is empty>
Response code: 200 (OK); Time: 126ms; Content length: 0 bytes
我们期待的是响应一个json字符串,不管是否请求成功。如果请求失败,就在这个json串中写明错误原因。
这里的问题在于 doRequest
代码的返回值是 Mono<ApiRsp>
。这个可能为 Mono.empty()
。所以响应内容为空。可以用 switchIfEmpty
来解决。具体见下面的代码:
@PostMapping("/demo")
public Mono<ApiRsp> demo(RequestForm form, BindingResult errors) {
return Mono.justOrEmpty(errors)
.filter(Errors::hasErrors)
.map(err -> ApiRsp.error(err.toString()))
.switchIfEmpty(doRequest(form).switchIfEmpty(Mono.just(ApiRsp.INSTANCE)));
}
希望各位大神注意。
0 条评论
撰写评论