springboot下全局异常处理和自定义异常以及自定义返回值

版权声明:未经授权,不得转载。 https://blog.csdn.net/soulsda/article/details/83684445

1.介绍

   全局异常处理,是mvc的一个新特性,避免大量的重复代码

   自定义异常 , 方便使用,抛出自己定义好的异常,配合全局异常处理使用,效果更佳

   自定义返回值,类似异常,返回自己定义的返回值

2.全局异常处理重点知识

1. 
    新建一个类,我起名为ExceptionHandlerAdvice,意思是错误切面
2.
    打上注解 @ResponseBody 和 @ControllerAdvice,前者是捕获异常后返回前端的值得类型为json,后者是声明为controller层的切面。
3.
    @ExceptionHandler(Exception.class) 这个不是类的注解而是类中方法的注解,意思是捕获对应的异常,此注解意为 捕获 Exception 的异常。
   
3.全局异常处理demo

import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


@ControllerAdvice
@ResponseBody
public class ExceptionHandlerAdvice {

    @ExceptionHandler(Exception.class)
    public ApiResult handleException(Exception e){
        return new ApiResult(Constants.RESP_STATUS_INTERNAL_ERROR,"系统异常,请稍后再试");
    }

    //自定义异常

    @ExceptionHandler(MyException.class)
    public ApiResult handleException(MamaBuyException e){
        return new ApiResult(e.getStatusCode(),e.getMessage());
    }
    
    //这是实体类 参数校验注解不通过会抛出的异常 只有全局异常能拦截到
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ApiResult handleIllegalParamException(MethodArgumentNotValidException e) {
        List<ObjectError> errors = e.getBindingResult().getAllErrors();
        String message = "参数不合法";
        if (errors.size() > 0) {
            message = errors.get(0).getDefaultMessage();
        }
        ApiResult result = new ApiResult(Constants.RESP_STATUS_BADREQUEST,message);
        return result;
    }

}

4.自定义异常

   继承RuntimeException类就可以实现自己的异常。

public class MyException extends RuntimeException{

    //状态码默认500
    private int statusCode = Constants.RESP_STATUS_INTERNAL_ERROR;
    
    public MyException(int statusCode,String message) {
        super(message);
        this.statusCode = statusCode;
    }
    public MyException(String message) {
        super(message);
    }

    public int getStatusCode() {
        return statusCode;
    }
}

5.自定义返回ApiResult

@Data //这个注解是lombok的工具类,不用get set ,idea使用需要加lombok插件 和引入jar包 
public class ApiResult<T> {
    
    //默认状态码200  其实就是一个工具类存的数字 替换成数字就行了
    private int code = Constants.RESP_STATUS_OK;

    private String message;

    private T data;

    public ApiResult() {
    }

    public ApiResult(int code, String message) {
        this.code = code;
        this.message = message;
    }
}

6.顺便说下在实体类上的注解校验吧

1.在controller层的实体类前加上@Valid注解
    @RequestMapping("login")
    public ApiResult login(@Valid User user, HttpSession session){
    }
2.进入到对应实体类
    @Email(message = "邮箱格式不正确")
    private String email;

    @NotBlank(message = "不能为空")
    private String password;
    //在实体类上打上对应校验注解 以上是两个举例 邮箱校验 和 不为空校验

7.闲谈

   本来打算只写个全局异常处理,结果写了后发现,和自定义异常、自定义返回值关联性很强

   而且几个也没多少可写的,就顺便写一块了

猜你喜欢

转载自blog.csdn.net/soulsda/article/details/83684445