响应前端成功效果:
{
"msg": "登录成功",
"data": {
"username": "admin",
"password": "admin"
},
"code": 200
}
失败效果:
{
"msg": "用户密码错误",
"data": null,
"code": 10010
}
一、创建响应前端的结果集实体类:
ResponseResult
统一向前端返回结果集
package com.cs.demo.exception;
/**
* @author CHAN
* @date 2020/01/18
*/
public class ResponseResult<T> {
/**
* 错误码
*/
private Integer code;
/**
* 错误内容
*/
private String msg;
/**
* 返回前端数据
*/
private T data;
public ResponseResult() {
}
public ResponseResult(Integer code, String msg, T data) {
this.code = code;
this.msg = 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 T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
二、创建一个表示错误代码的枚举类:
CodeEnum
package com.cs.demo.exception;
import org.omg.CORBA.UNKNOWN;
/**
* @author CHAN
* @date 2020/01/18
*/
public enum CodeEnum {
SUCCESS(200, "登录成功"),
PASSWORD_ERROR(10010, "用户密码错误"),
UNKNOWN_ERROR(10086, "发生未知异常");
private Integer code;
private String msg;
CodeEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
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;
}
}
三、创建自定义异常类:
UserException
自定义异常类需要继承 RuntimeException
package com.cs.demo.exception;
/**
* @author CHAN
* @date 2020/01/18
*/
public class UserException extends RuntimeException {
private Integer code;
public UserException(CodeEnum status){
super(status.getMsg());
this.code = status.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
四、创建全局异常捕获类:
UserExceptionHandler
利用 @RestControllerAdvice
以及 @ExceptionHandler
捕获所有控制层抛出的异常
package com.cs.demo.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @author CHAN
* @date 2020/01/18
*/
@RestControllerAdvice
public class UserExceptionHandler {
@ExceptionHandler(UserException.class)
public ResponseResult responseResult(Exception ex){
ResponseResult responseResult = new ResponseResult();
// 捕获自定义业务异常
if(ex instanceof UserException){
responseResult.setCode(((UserException) ex).getCode());
responseResult.setMsg(ex.getMessage());
return responseResult;
}
// 非自定义业务异常 -- 按自己需求处理
responseResult.setCode(CodeEnum.UNKNOWN_ERROR.getCode());
responseResult.setMsg(CodeEnum.UNKNOWN_ERROR.getMsg());
return responseResult;
}
}
控制层测试
@PostMapping(value = "/login")
private ResponseResult login(User user){
if (!"admin".equals(user.getPassword())){
throw new UserException(CodeEnum.PASSWORD_ERROR);
}
return new ResponseResult(CodeEnum.SUCCESS.getCode(), CodeEnum.SUCCESS.getMsg(), user);
}
大功告成
测试:成功
测试:失败
注意:
如果出现捕获全局异常失效或者无反应的情况,请确保使用注解@RestControllerAdvice
, @ControllerAdvice
的类被spring容器扫描到。
@SpringBootApplication(scanBasePackages = “Handler 类所在的包路径”)