共计 2963 个字符,预计需要花费 8 分钟才能阅读完成。
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); | |
} | |
} |
正文完