关于java:springMVC异常处理流程

41次阅读

共计 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);
    }
}

正文完
 0