日常开发中,经常会遇到前后端交互的时候,后端返回前端数据的问题,通常的做法是在Controller里将需要的数据以JSON的格式返回,但是为了系统更加的有条理性,也为了异常排查问题方便,我们整合一个交互VO类(顺便多一嘴,命名的时候,这里的VO全通常全部使用大写),VO类里面包括了以下几点:
1.请求结果result;
2.返回状态码code;
3.如果请求失败的话还有失败原因reason;
4.需要返回给前端的数据
但是返回的数据并不是所有都是一个类别的,如果我们给每一个用到的实体类都加一个VO交互类的话,那么维护起来不仅不方便,还会增加代码的复杂度。所以在这里使用建造者模式编写了通用的VO类,用于减少代码的复用性,和VO类的数量。
(对设计模式不清楚的同学,我在github上有对应的示例,感兴趣可以去看一下:https://github.com/higminteam/practice/tree/master/src/main/java/com/practice/designPatterns/creationType/builderMode)
上代码:
1. 编写通用VO类 ResultMessage.java
import java.util.List;
/**
* 前端通用 VO
**/
public class ResultMessage {
private Boolean result; // 请求结果
private Integer msgCode; // 响应状态码
private String reason; // 失败原因
private List list; // 返回数据
private ResultMessage(Boolean result, Integer msgCode, List list, String reason) {
this.result = result;
this.msgCode = msgCode;
this.list = list;
this.reason = reason;
}
public Boolean getResult() {
return result;
}
public void setResult(Boolean result) {
this.result = result;
}
public Integer getMsgCode() {
return msgCode;
}
public void setMsgCode(Integer msgCode) {
this.msgCode = msgCode;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
@Override
public String toString() {
return "ResultMessage{" +
"result=" + result +
", msgCode=" + msgCode +
", reason='" + reason + '\'' +
", list=" + list +
'}';
}
public static ResultMessageBuilder builder(){
return new ResultMessageBuilder();
}
public static class ResultMessageBuilder{
private Boolean result;
private Integer msgCode;
private List list;
private String reason;
public ResultMessageBuilder() {
}
public Boolean getResult() {
return result;
}
public ResultMessageBuilder setResult(Boolean result) {
this.result = result;
return this;
}
public Integer getMsgCode() {
return msgCode;
}
public ResultMessageBuilder setMsgCode(Integer msgCode) {
this.msgCode = msgCode;
return this;
}
public List getList() {
return list;
}
public ResultMessageBuilder setList(List list) {
this.list = list;
return this;
}
public String getReason() {
return reason;
}
public ResultMessageBuilder setReason(String reason) {
this.reason = reason;
return this;
}
public ResultMessage build(){
if (result == null){
throw new RuntimeException("返回结果必填!");
}
return new ResultMessage(result, msgCode, list, reason);
}
}
}
2. 使用起来也是很便捷的,下面举例说明:
@ApiOperation(value="提前结束会议",httpMethod="POST",notes="提前结束会议")
@RequestMapping(value = "/preFinishMeeting",method = RequestMethod.POST)
public ResultMessage preFinishMeeting(@RequestBody Meeting meeting) {
// 测试存放数据 ,这里随便造一个 list
List<Meeting> meetings = Arrays.asList(new Meeting());
int rows = meetingService.preFinishMeeting(meeting);
if (rows > 0) {
return ResultMessage.builder()
.setResult(true)
.setMsgCode(200)
.build();
}else if (rows == -1){
return ResultMessage.builder()
.setResult(false)
.setMsgCode(202)
.setList(meetings) // 返回前端数据,这里只是模拟把数据加进去
.setReson("该会议暂未开始,不能提前结束!")
.build();
}else if (rows == -2){
return ResultMessage.builder()
.setResult(false)
.setMsgCode(203)
.setList(meetings) // 返回前端数据,这里只是模拟把数据加进去
.setReson("该会议已经结束,不能提前结束!")
.build();
}
return ResultMessage.builder()
.setResult(false)
.setMsgCode(500)
.setReson("服务器异常")
.build();
}
3. 感谢大家的阅读与支持,希望可以帮助到大家。
不积硅步无以至千里,不积小流无以成江河。