Hibernate Validator 异常统一处理

每个Validation注解都有一个相同的配置参数message,用来定义校验失败抛出的异常信息。

  Bean属性校验失败,Hibernate Validator抛出MethodArgumentNotValidException异常,示例如下:

{
    "timestamp": 1604281270618,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.web.bind.MethodArgumentNotValidException",
    "errors": [
        {
            "codes": [
                "AssertTrue.department.locatedInJiNan",
                "AssertTrue.locatedInJiNan",
                "AssertTrue.java.lang.Boolean",
                "AssertTrue"
            ],
            "arguments": [
                {
                    "codes": [
                        "department.locatedInJiNan",
                        "locatedInJiNan"
                    ],
                    "arguments": null,
                    "defaultMessage": "locatedInJiNan",
                    "code": "locatedInJiNan"
                }
            ],
            "defaultMessage": "只可以为true",
            "objectName": "department",
            "field": "locatedInJiNan",
            "rejectedValue": false,
            "bindingFailure": false,
            "code": "AssertTrue"
        }
    ],
    "message": "Validation failed for object='department'. Error count: 1",
    "path": "/department/add"
}

  URL参数校验失败,Hibernate Validator抛出ConstraintViolationException异常,示例如下:

{
    "timestamp": 1604281366585,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "javax.validation.ConstraintViolationException",
    "message": "update.desc: 长度需要在1和3之间",
    "path": "/department/update/abf"
}

  这两个原生异常,对用户不友好,也不符合项目返回数据格式。所以需要进行统一异常处理,统一Hibernate Validator校验失败时返回数据格式,示例代码如下:

package com.inspur.validator.controller;

import com.inspur.validator.common.ReturnBean;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.FieldError;
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;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set;

/**
 * @author mark
 * @date 2020/11/1 16:20
 */
@ControllerAdvice
public class ExceptionHanderController {

    /**
     * 处理Hibernate Validator校验Bean参数抛出异常
     */
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ReturnBean handlerMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        // 1.校验
        Boolean fieldErrorUnobtainable = (e == null || e.getBindingResult() == null
                || CollectionUtils.isEmpty(e.getBindingResult().getAllErrors()) || e.getBindingResult().getAllErrors().get(0) == null);
        if (fieldErrorUnobtainable) {
            return ReturnBean.success();
        }

        // 2.错误信息
        FieldError fieldError = (FieldError) e.getBindingResult().getAllErrors().get(0);
        String objectName = fieldError.getObjectName();
        String field = fieldError.getField();
        String defaultMessage = fieldError.getDefaultMessage();
        String errMsg = "参数" + objectName + '.' + field + ":" + defaultMessage;

        // 3.return
        return ReturnBean.fail(errMsg);
    }

    /**
     * 处理Hibernate Validator校验URL参数抛出异常
     */
    @ResponseBody
    @ExceptionHandler(ConstraintViolationException.class)
    public ReturnBean handlerConstraintViolationException(ConstraintViolationException e) {
        // 1.校验
        Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
        if (CollectionUtils.isEmpty(constraintViolations)) {
            return ReturnBean.success();
        }

        // 2.错误信息
        ConstraintViolation<?> constraintViolation = constraintViolations.iterator().next();
        String name = constraintViolation.getPropertyPath().toString();
        String message = constraintViolation.getMessage();
        String errMsg = "参数" + name + ":" + message;

        // 3.return
        return ReturnBean.fail(errMsg);
    }
}

补充说明:@ControllerAdvice注解和@ExceptionHandler的配合使用,是基于Spring提供的能力,开启全局异常处理。@ExceptionHandler注解的配置参数value()是用来指定截获哪种异常。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值