springboot 整合 hibernate validation全局拦截参数校验

需求

对请求接口的参数进行校验

项目情况

springboot 2.1.0,引入spring-boot-starter-validation,(查找资料时,看到有文章说spring-boot-starter-web中包含了hibernate-validator,但是在我的项目中并不起作用,这个比较奇怪,但先不深究)

实现过程

1、项目引入spring-boot-starter-validation
2、全局异常拦截中增加以下方法

    /**
     * validation Exception
     *
     * @param exception e
     * @return R
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.OK)
    public R handleBodyValidException(MethodArgumentNotValidException exception) {
        List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
        StringBuilder message = new StringBuilder();
        for (FieldError error : fieldErrors) {
            message.append("字段:" + error.getField()).append(" ").append(error.getDefaultMessage()).append(",");
        }
        message = new StringBuilder(message.substring(0, message.length() - 1));
        log.error("参数绑定异常,MethodArgumentNotValidException ,msg = {}", fieldErrors.get(0).getDefaultMessage());
        return R.builder()
                .errmsg(message.toString())
                .errcode(HttpServletResponse.SC_BAD_REQUEST)
                .build();
    }

    @ExceptionHandler(value = BindException.class)
    @ResponseStatus(HttpStatus.OK)
    public R handleBindException(BindException e) {
        StringBuilder message = new StringBuilder();
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        for (FieldError error : fieldErrors) {
            message.append(error.getField()).append(error.getDefaultMessage()).append(",");
        }
        message = new StringBuilder(message.substring(0, message.length() - 1));
        log.error("请求参数类型错误,ex = {}", e.getMessage());
        return R.fail(message.toString());
    }

    /**
     * Hibenate validation Exception
     *
     * @param exception the e
     * @return R
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseStatus(HttpStatus.OK)
    public R handleConstraintViolationException(ConstraintViolationException exception) {
        StringBuilder message = new StringBuilder();
        Set<ConstraintViolation<?>> violations = exception.getConstraintViolations();
        for (ConstraintViolation<?> violation : violations) {
            Path path = violation.getPropertyPath();
            String[] pathArr = StringUtils.splitByWholeSeparatorPreserveAllTokens(path.toString(), ".");
            message.append(pathArr[1]).append(violation.getMessage()).append(",");
        }
        message = new StringBuilder(message.substring(0, message.length() - 1));
        log.error("参数验证异常,ConstraintViolationException,msg = {}", message.toString());
        return R.builder()
                .errmsg(message.toString())
                .errcode(ResultCode.PARAM_VALID_ERROR.getCode())
                .build();
    }

3、使用示例
1)json格式的参数,在bean前面加上@Valid:

public void XXX(@RequestBody @Valid XXXDTO dto) {
	//
}

//相应的bean里面的参数
 @NotNull(message = "不能为空")
 private Long questionnaireId;

2)form表单方式的参数,注意需要在该方法的类上面注解

@Validated
public class XXXController {
	public void del(@RequestParam("id") @NotNull(message = "不能为空") Long id) {
		//
	}
}

总结

总体来说使用还是比较方便的,网上资料也很多,自己遇到的坑是,项目里已经有spring-boot-starter-web,但是还是需要单独引包,不引入则不起作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值