springMVC异常处理流程
1.创建异常状态的类
package com.javasm.http;
//创建异常状态
public enum EnumStatus {
//枚举对象 这里的 ; 是创建EnumStatus类时自动生成的,不是敲的
SUCCESS(20000, "请求成功"),
ERROR(50000, "请求失败"),
LOGIN_EXCEPTION(40002,"用户名或者密码错误"),
ORDER_ABNORMALITY(40003,"订单异常"),
PARAMETER_EXCEPTIONS(40004,"参数不正确");
private int status;//状态码
private String message;//状态码对应的提示信息
EnumStatus(int status, String message) {
this.status = status;
this.message = message;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
//1.定义status 和message
//2.生成getter和setter方法
//3.生成构造方法
//4.调用构造方法创建枚举对象
}
2.创建LoginException类,生成一个构造方法,在controller层抛出异常的时候调用
@Data
//继承RuntimeException表示运行时异常
//LoginException记录的异常需要交给全局异常进行处理,里面包含状态码和状态信息
//创建LoginException的作用:供外界调用里面的各种状态码和状态值,外界需要什么状态码,就通过LoginException获取
public class LoginException extends RuntimeException{
private EnumStatus enumStatus; //这里有 status message 属性
// 2.生成一个构造方法,供外界调用
public LoginException(EnumStatus enumStatus) {
this.enumStatus = enumStatus;
}
}
3.自定义异常(异常是controller抛出的,这里为了演示方便,自定义了若干异常)
package com.javasm.controller;
import com.javasm.exception.LoginException;
import com.javasm.http.EnumStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
//这里是自定义的异常,出现某个异常就通过调用LoginException里的状态值和状态码,来给这个异常起名字
public class ExceptionController {
//登录异常
@PostMapping("login")
public String login(){
if (true){
throw new LoginException(EnumStatus.LOGIN_EXCEPTION);
}
return "success";
}
//订单异常
@PostMapping("order")
public String order(){
if (true){
throw new LoginException(EnumStatus.ORDER_ABNORMALITY);
}
return "success";
}
}
4.创建ExceptionMessageBean,用来包含处理异常的状态码和状态信息
@Data
public class ExceptionMessageBean {
private int status;
private String message;
}
5.处理controller抛出的异常
//GloableExceptionHander是不处理异常,只是将异常变成json格式传给前端,前端将异常信息显示出来即可
/*
1.捕获异常
直接将LoginEeception这个类名当做参数传进Handle方法中,LoginEeception包含所有的异常
2.获取枚举对象
EnumStatus enumStatus = e.getEnumStatus();
3.获取枚举对象的状态码和状态值
int status = enumStatus.getStatus();
String message = enumStatus.getMessage();
4.此时的状态码和状态值就是想要显示的异常
将 status 和message放进exceptionMessageBean里面
5.将exceptionMessageBean里的对象转换成json字符串并返回
return new ResponseEntity(exceptionMessageBean, HttpStatus.OK);
*/
@RestControllerAdvice//Advice是加强的意思,表明这个类处理controller的异常
public class GloableExceptionHander {
@ExceptionHandler(LoginException.class)//只处理LoginException.class 类异常的方法,抛出的异常都在这个类当中
//new LoginException(EnumStatus.LOGIN_EXCEPTION)抛出的这个异常被被形参LoginException e获取到
//ResponseEntity把对象转成json字符串传给前端
public ResponseEntity handlerLoginException(LoginException e) {
//获取到枚举对象
EnumStatus enumStatus = e.getEnumStatus();
//获取状态码
int status = enumStatus.getStatus();
//获取message
String message = enumStatus.getMessage();
// 将以上获取到的状态放进exceptionMessageBean展示在页面上
//ResponseEntity是个泛型,里面只能存在一个参数
ExceptionMessageBean exceptionMessageBean = new ExceptionMessageBean();
exceptionMessageBean.setStatus(status);
exceptionMessageBean.setMessage(message);
return new ResponseEntity(exceptionMessageBean, HttpStatus.OK);
}
}