公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
在 SpringBoot 中,我们通常会对项目中封装一个消息返回对象。使用统一的编码,这个返现消息体是在 HTTP 的状态码上又包装了一层。如下所示:
{
code:996,
msg:"www.xttblog.com",
data:[{url:"www.xttblog.com",name:"业余草"}]
}
今天也有一个网友,在 WebFlux 群里问我,针对 Flux 和 Mono 如何封装这种消息对象?下面说一下我的做法。
先封装一个返回前端的消息体,代码如下所示:
public class ResponseInfo<T> implements Serializable {
private String msg;
private Integer code;
Object data;
public static <T> ResponseInfo<T> ok (T monoBody) {
final ResponseInfo<T> responseInfo = new ResponseInfo<>();
responseInfo.setCode(0);
responseInfo.setData(monoBody);
responseInfo.setMsg("ok");
return responseInfo;
}
// 省略其他 get/set 和 error 等
}
然后在返回 Mono 的地方进行包装。
// 控制层
@RestController
@RequestMapping("/test")
public class UserController {
@GetMapping("/oop")
public Mono getXttblog() {
// 模拟获取数据
final Mono<String> data = Mono.just("微信号:codedq");
//return ResponseInfo.ok(data);
// 简写
return Mono.just(ResponseInfo.ok(data));
}
}
Mono 返回数据封装起来很简单,但是在返回 Flux 的地方就不好封装了。因为一个 Flux 对象代表一个包含 0 个或多个(0..N)元素的响应式序列,而一个 Mono 对象代表一个包含 0 或一个(0..1)元素的结果。
通常我们的 Repository 返回的都是 Flux 数据流。通过 Controller 返回给前端的数据转换成 JOSN 基本上就是一个数组 […]。
public Flux<Project> findAllPrj() {
return projectRepository.findAll();
}
如果是 Flux<ResponseInfo>,那就是数组中每个对象都带有 code,msg,data 信息。
这个时候,我们应该要想到 Flux 的 flatMap 方法。下面看一个 Flux.flatMap 方法的转换例子。
public Mono<ServerResponse> getDeviceTypes(){
return deviceService.findDeviceTypes()
.flatMap(devices -> {
ResponseInfo r = new ResponseInfo();
r.setMessage("Test");
r.setCode("200");
r.setStatus(200);
r.setData(devices);
return ok().body(Mono.just(r), ResponseInfo.class);
});
}
以上,希望能够帮助到更多人。更多关于 WebFlux 的使用技巧,请阅读这些文章:《Spring WebFlux 教程》。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » WebFlux之Flux、Mono自定义统一返回消息