拿走了什么
今天来说下Spring Boot中统一返回结果的封装。
为什么要封装结果?
来看一张没有封装的。
再看是经过封装过返回的数据。 从第二张可以看到多了,我们自定义的结果状态、信息以及数据,在我们正常开发的过程中我们需要给前端返回一些带有状态码
的结果,前端会根据这个结果来提示用户操作的结果,像这样成功的会返回操作成功
的消息提示
如果操作失败会返回失败的提示
所以我们对结果的处理会很重要。
步骤
首先创建一个枚举用来RetCode
public enum RetCode {
//成功
SUCCESS(200),
//失败
FAIL(400),
//错误
FALSE(404),
//内部错误
ERROR(500);
private int code;
private RetCode(Integer code){
this.code = code;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
里面code的数值你可以根据实际来自定义~ 然后对结果处理的一个类
public class RetResult {
private Integer code;
private String msg;
private Object data;
public RetResult(){
this.code = Integer.valueOf(0);
this.msg = "";
this.data = null;
}
/**
*返回状态码、信息、以及数据
*/
public RetResult(Integer code, String msg, Object data) {
this.code = code;
this.msg = "";
this.data = null;
}
/**
*只返回状态码,以及信息可以用于失败时候来使用
*/
public RetResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
this.data = null;
}
/**
*只返回状态码和数据
*/
public RetResult(Integer code, Object data) {
this.code = code;
this.msg = "";
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
其中msg
是你想要返回的信息,code
就是自定义的状态码了,data
是要返回的数据,这里我采用了Object
类型。而且这里我写了几个重载方法,可以根据自己的需求来灵活调整
改造Service、Controller
把我们上节UserService
类改造一下
public RetResult queryUserById(Map<String,Object> map){
if(map.get("user_id") == null){
return new RetResult(RetCode.FAIL.getCode(),"id不能为空");
}
return new RetResult(RetCode.SUCCESS.getCode(),userMapper.queryUserById(Long.parseLong(map.get("user_id").toString())));
}
就是把我们之前返回的数据给放到Data中了,然后UserController
的改造
@RequestMapping(value = "/user/getUser")
public RetResult getUser(@RequestBody Map<String ,Object> map){
return userService.queryUserById(map);
}
其中Controller
我们可以集中来处理Exception
这个以后会加上。
先测试如果我们先不传数据返回的信息: