SpringBoot 2.7教程:SpringBoot 整合 Web 项目搭建,异常捕获处理-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot + Web 项目搭建及实践应用-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot + Web 项目搭建,异常捕获处理-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot + Mysql 项目应用-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot 集成 jsp 页面开发 -2022年最新图文版本

SpringBoot 2.7教程:SpringBoot 实现文件上传,图片上传并显示功能-2022年最新图文版本

SpringBoot 2.7教程:springboot 设置全局字符编码,解决乱码问题-2022年最新图文版

SpringBoot 2.7教程:SpringBoot mybatis 多数据源的整合方法-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot 整合 RocketMQ 项目搭建-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot 整合 RabbitMQ 项目搭建-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot 整合 MongoDB 项目搭建-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot 整合 Redisson 项目搭建-2022年最新图文版本

SpringBoot 2.7教程:SpringBoot 整合 Redis 项目搭建-2022年最新图文版本

本章主要目标:

1.异常捕获,转化为通用异常信息。

当前最新的版本是2.7,下面我们开始进行搭建系统。        

接上一章,如果出现了参数异常的情况。如下图:

SpringBoot 2.7教程:SpringBoot 整合 Web 项目搭建,异常捕获处理-2022年最新图文版本_第1张图片日志报错信息:

2022-06-10 11:42:14.021  WARN 7544 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.xiaoma.usercenter.response.ApiResult com.xiaoma.usercenter.controller.UserController.userGet(com.xiaoma.usercenter.controller.form.LoginForm): [Field error in object 'loginForm' on field 'password': rejected value [null]; codes [NotNull.loginForm.password,NotNull.password,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [loginForm.password,password]; arguments []; default message [password]]; default message [不能为null]] ]

我们需要将这个异常信息捕获,并转化为通用错误。

package com.xiaoma.usercenter;

import com.xiaoma.usercenter.response.ApiResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.stream.Collectors;

/**
 * @author fenghaikuan
 * @description 全局异常处理,处理自定义的异常,其他异常往外抛
 * @className GlobalExceptionHandler
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
     *
     * @param
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = ConstraintViolationException.class)
    public ApiResult constraintViolationExceptionHandler(ConstraintViolationException e) {
        String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
        return ApiResult.failed(20000, "ConstraintViolationException,输入数据异常" + message);
    }

    /**
     * 处理Post请求,参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
     * 添加全局异常处理流程,根据需要设置需要处理的异常,以MethodArgumentNotValidException为例
     *
     * @param e
     * @return ApiResult
     * @throws Exception
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Object MethodArgumentNotValidHandler(MethodArgumentNotValidException e) throws Exception {
        HashMap errorMsg = new HashMap();

        for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
            errorMsg.put(fieldError.getField(), fieldError.getDefaultMessage());
        }
        return ApiResult.failed(20000, "MethodArgumentNotValidException,输入数据异常" + errorMsg);
    }

    /**
     * 处理Get请求,使用@Valid 验证路径中请求实体校验失败后抛出的异常,详情继续往下看代码
     *
     * @param bindException
     * @return ApiResult
     */

    @ExceptionHandler(BindException.class)
    public ApiResult bindExceptionHandler(BindException bindException) {
        HashMap errorMsg = new HashMap();

        for (FieldError fieldError : bindException.getBindingResult().getFieldErrors()) {
            errorMsg.put(fieldError.getField(), fieldError.getDefaultMessage());
        }
        return ApiResult.failed(20000, "BindException,输入数据异常" + errorMsg);
    }

}

使用PostMan测试一下

SpringBoot 2.7教程:SpringBoot 整合 Web 项目搭建,异常捕获处理-2022年最新图文版本_第2张图片

你可能感兴趣的:(SpringBoot,分布式微服务,spring,boot,java,后端)