您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
二周 发布于2020年07月27日 13:15 最近更新于 2020年07月30日 09:47

原创 使用 WebFlux API 存在的坑

4342 次浏览 读完需要≈ 4 分钟 Java

内容目录

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)));
}

希望各位大神注意。

  • CodePlayer技术交流群1
  • CodePlayer技术交流群2

0 条评论

撰写评论