统一返回结果集封装 & 全局异常处理
1.统一返回结果集封装
项目中我们会将响应封装成son返回,一般我们会将所有接口的数据格式统一,使前端(iOS Android, Web)对数据的操作更—致、轻松。
一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。
但是一般会包含状态码、返回消息、数据这几部分内容。
例如,我们的系统要求返回的基本数据格如下:
封装代码如下:
package com.fansir.bootwebadmin.common; public interface ResultCode { //成功状态码 public static Integer SUCCESS=2000; //失败状态码 public static Integer ERROR=2001; }
package com.fansir.bootwebadmin.common; import java.util.HashMap; import java.util.Map; /** * 统一返回结果封装类 */ public class Result { //操作是否成功 private Boolean success; //返回状态码 private Integer code; //返回消息 private String message; //返回数据 private Map<String,Object> data=new HashMap<>(); private Result(){} //成功 public static Result ok(){ Result result=new Result(); result.setSuccess(true); result.setCode(ResultCode.SUCCESS); result.setMessage("操作成功"); return result; } //失败 public static Result error(){ Result result=new Result(); result.setSuccess(false); result.setCode(ResultCode.ERROR); result.setMessage("操作失败"); return result; } //设置返回消息 public Result message(String message){ this.setMessage(message); return this; } //设置返回状态码 public Result code(Integer code){ this.setCode(code); return this; } //设置返回数据 public Result data(String key,Object value){ this.data.put(key,value); return this; } //设置返回数据 public Result data(Map<String,Object>map){ this.setData(map); return this; } public Boolean getSuccess() { return success; } public void setSuccess(Boolean success) { this.success = success; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Map<String, Object> getData() { return data; } public void setData(Map<String, Object> data) { this.data = data; } @Override public String toString() { return "Result{" + "success=" + success + ", code=" + code + ", message='" + message + '\'' + ", data=" + data + '}'; } }
---------------------------------------------------------------------------------------------------
2.统一异常处理
package com.fansir.bootwebadmin.exception;
import com.fansir.bootwebadmin.common.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
/**
* 统一异常处理
*/
public class GlobalExceptionHandler {
//全局异常
@ExceptionHandler(Exception.class) //表示所以异常都会经过这里
@ResponseBody
public Result handleSomeException(Exception e){ //自动封装到Exception里
e.printStackTrace();
return Result.error().message("执行了全局异常...");
}
//特定异常
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public Result handleSomeException(ArithmeticException e){ //自动封装到Exception里
e.printStackTrace();
return Result.error().message("除数不能为零...");
}
//自定义异常 (最灵活好用)
@ExceptionHandler(MyException.class)
@ResponseBody
public Result handleSomeException(MyException e){ //自动封装到Exception里
e.printStackTrace();
return Result.error().code(e.getCode()).message(e.getMsg());
}
}
package com.fansir.bootwebadmin.exception; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; /** * 自定义异常 */ @Data @NoArgsConstructor @AllArgsConstructorpublic class MyException extends RuntimeException{ //状态码 private Integer code; //异常信息 private String msg; }
代码中实际使用异常方法:
//测试自定义异常 @GetMapping("/test1") public String testError1(){ if(a==0){
//手动抛出自定义异常 throw new MyException(9999,"除数不能为0"); } return "login"; }