在工作过程中,如果项目架构没有做到位,对于异常没有特殊的处理,通常会将代码执行过程中遇到Exception会直接以栈信息的形式返回给前端。其中这样的形式不美观,并且也非常危险(比如:插入表错误,会返给前端关于表名称和表字段信息)。针对这种情况,其实无论springmvc还是springboot都有统一的注解进行统一的封装处理返给前端。下面我大概介绍一下我们项目都是怎么统一封装处理的。
1、因为我们项目都是前后端分离的项目于,所以后端服务通常都是以接口的形式展示给前端。所以我们通常我们会封装统一的返回成功或者失败的信息。
public class RestResponse {
private String code;
private boolean success = false;
private String msg;
private T data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public static RestResponse success(Object data) {
return create("0", "成功", true, data);
}
public static RestResponse fail(String code, String msg) {
return create(code, msg, false, null);
}
public static RestResponse create(String code, String msg, boolean success, Object data) {
RestResponse resp = new RestResponse();
resp.setCode(code);
resp.setMsg(msg);
resp.setSuccess(success);
resp.setData(data);
return resp;
}
}
2、我们会自定义一些业务异常,返给前端,以便前端展示对应的错误,让用户明白操作哪里有问题。但是有时候也有有非业务异常,这样通常会统一封装,返回前端错误信息“系统异常,请联系管理员”的错误信息。
public class BusinessException extends RuntimeException{
private String code;
private String message;
public BusinessException() {
}
public BusinessException(String message, String errCode) {
super((String)null);
this.code = errCode;
this.message = message;
}
public BusinessException(String message, Throwable cause) {
super((String)null, cause);
this.message = message;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3、全局拦截器返回的错误信息,根据不同的异常类型调用对应的方法。
public class GlobalExceptionHandle {
/**
* 统一处理业务异常
*
* @param e
* @param
* @return
*/
@ExceptionHandler(BusinessException.class)
public RestResponse doBusException(BusinessException e) {
//1、记录错误日志
//2、返回结果
return RestResponse.fail(e.getCode(), e.getMessage());
}
/**
* 处理其他异常
*
* @param e
* @param
* @return
*/
@ExceptionHandler
public RestResponse doException(Exception e) {
//1、记录错误日志
//2、返回结果
return RestResponse.fail("500","系统异常,请联系管理员");
}
}
4、最后这是我们的实现一个接口调用,返回业务报错验证这个这个结果。
@RestController
@RequestMapping("")
public class LoginController {
/**
* 检验登录用户是否正确
*
* @param name 用户名
* @param password 密码
* @return
*/
@RequestMapping("/login")
public RestResponse checkLogin(@RequestParam("name") String name, @RequestParam("password") String password) {
if (!(Objects.equals(name, "hxx") && Objects.equals(password, "123456"))) {
throw new BusinessException("1000", "登录信息有误!");
}
return RestResponse.success(true);
}
}
最后我们可以看到结果信息
5、验证非业务异常信息
@RestController
@RequestMapping("")
public class LoginController {
/**
* 检验登录用户是否正确
*
* @param name 用户名
* @param password 密码
* @return
*/
@RequestMapping("/login")
public RestResponse checkLogin(@RequestParam("name") String name, @RequestParam("password") String password) {
int result = 1 / 0;
return RestResponse.success(true);
}
}
最后我们可以看到结果信息