妈妈再也不用担心我的后端接口校验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wm5920/article/details/85693978

做后端的同学都知道参数校验实在是太繁琐的事情,今天我们就借助于hibernate.validator实现解放我们的双手,让校验变得赏心悦目

手写的一个工具类

package com.util;

import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.constraints.*;

import javax.validation.*;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 对象校验工具类
 */
public class ValidatorUtil {
    private Validator val;

    private ValidatorUtil(){
        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
                .configure()
                // 是否快速返回错误,false返回全部错误,true只返回第一条错误
                .addProperty( "hibernate.validator.fail_fast", "false" )
                .buildValidatorFactory();
        val = validatorFactory.getValidator();
    }
    public static ValidatorUtil getIns(){
        return Holder.ins;
    }


    private static class Holder{
        private static ValidatorUtil ins=new ValidatorUtil();
    }



    public  <T> String getMsg(T model){
        Set<ConstraintViolation<T>> violationSet = val.validate(model);
        StringBuilder sb=new StringBuilder();
        for (ConstraintViolation<T> m : violationSet) {
            sb.append(m.getMessage()).append(" ");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        Demo d=new Demo();
        d.list=new ArrayList<>();
        d.str="";
        System.out.println(ValidatorUtil.getIns().getMsg(d));
    }
}

/**
 * 常用
 */
class Demo{
    @NotBlank(message = "name空")
    public String name;
    @NotNull(message = "name1空")
    public String name1;
    @NotEmpty(message = "name2空")
    public String name2;
    @NotEmpty(message = "email空")
    @Email(message = "email格式错误")
    public String email;
    @NotEmpty(message = "list空")
    public List<String> list;
    @Range(min=1,max=5,message = "不在range")
    public Integer num;

    @Min(value = 1,message = "最低1")
    @NotEmpty(message = "num1空")
    public Integer num1;
    @Max(value =2 ,message = "最大2")
    @NotNull(message = "num2空")
    public Integer num2;

    @Length(min = 1, max = 20, message = "字符串过长")
    public String str;

    //级联
    @Valid
    List<Demo> ds;
}

使用方法见demo与main

spring boot项目中集成

再controller方法中添加注解

@RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public ResponseData addOrUpdate(@Valid @RequestBody TemplateVo vo) {

vo中属性加上校验注解,参考demo类
再添加到异常处理拦截器,这样当参数校验失败时,自动拦截返回自定义消息对象

import org.springframework.http.HttpStatus;
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 org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class DefaultExceptionHandler {
@ExceptionHandler({MethodArgumentNotValidException.class})
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Object validException(MethodArgumentNotValidException e) {
    	System.out.println(ValidUtil.getErrors(e.getBindingResult())))
        return new Object();
    }
}

ValidUtil


import java.util.Iterator;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

public class ValidUtil {
    public ValidUtil() {
    }

    public static String getErrors(BindingResult bindingResult) {
        String errorMesssage = "校验信息:\n";
        FieldError fieldError;
        if (bindingResult.hasErrors()) {
            for(Iterator var2 = bindingResult.getFieldErrors().iterator(); var2.hasNext(); errorMesssage = errorMesssage + fieldError.getDefaultMessage() + "\n") {
                fieldError = (FieldError)var2.next();
            }
        }

        return errorMesssage;
    }
}

猜你喜欢

转载自blog.csdn.net/wm5920/article/details/85693978