验证参数注解校验总结

验证参数注解校验总结

【参数校验注解的使用规则方法】:

空检查

@Null 验证对象是否为null

@NotNull 验证对象是否不为null, 无法查检长度为0的字符串

@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.

@NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查

@AssertTrue 验证 Boolean 对象是否为 true

@AssertFalse 验证 Boolean 对象是否为 false

长度检查

@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内

@Length(min=, max=) Validates that the annotated string is between min and max included.

日期检查

@Past 验证 Date 和 Calendar 对象是否在当前时间之前

@Future 验证 Date 和 Calendar 对象是否在当前时间之后

@Pattern 验证 String 对象是否符合正则表达式的规则

数值检查

建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null

@Min 验证 Number 和 String 对象是否大等于指定的值

@Max 验证 Number 和 String 对象是否小等于指定的值

@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度

@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度

@Digits 验证 Number 和 String 的构成是否合法

@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 @Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum. @Range(min=10000,max=50000,message=“range.bean.wage”) private BigDecimal wage;

@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)

@CreditCardNumber信用卡验证

@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。

@ScriptAssert(lang= ,script=, alias=)

@URL(protocol=,host=, port=,regexp=, flags=) 

【注解@ScriptAssert】:

注解@ScriptAssert是处理实体类复杂业务逻辑的,具体参考文章:Spring boot使用总结(三)校验

(1)举例实体类请求参数:

package com.caox.model;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.ScriptAssert;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import com.caox.model.UserInfo.CHECK;

import java.io.Serializable;

/**
 * @author : nazi
 * @version : 1.0
 * @date : 2019/6/5 14:27
 */
@Data
@Setter
@Getter
@ScriptAssert(lang="javascript",script="com.caox.model.UserInfo.checkParams(_this.username,_this.age,_this.classes)",
        groups=CHECK.class)
public class UserInfo implements Serializable {

    private static final long serialVersionUID = 8660354316408237192L;
    @NotBlank(groups=NAME.class)
    private String username;
    //    private Date birthDate;
    @Min(value=3,groups=AGE.class)
    private Integer age;
    private String classes;
    public interface CHECK{};
    private Integer userId;

    public interface NAME{};

    public interface AGE{};

    //注意进行校验的方法要写成静态方法,否则会出现
    //TypeError: xxx is not a function 的错误
    public static boolean checkParams(String username, int age, String classes) {
        if (username != null && age > 8 && classes != null) {
            return true;
        } else {
            return false;
        }
    }

//
//    public UserInfo(Integer userId, String username, Date birthDate, Integer age, float fRate, char ch) {
//        this.userId = userId;
//        this.username = username;
//        this.birthDate = birthDate;
//        this.age = age;
//        this.fRate = fRate;
//        this.ch = ch;
//    }
//
//    public UserInfo(Integer userId, String username) {
//        this.userId = userId;
//        this.username = username;
//    }
//
//    public UserInfo(Integer userId, String username, Integer age) {
//        this.userId = userId;
//        this.username = username;
//        this.age = age;
//    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        UserInfo userInfo = (UserInfo) o;

        if (!userId.equals(userInfo.userId)) return false;
        return username.equals(userInfo.username);

    }

    @Override
    public int hashCode() {
        int result = userId.hashCode();
        result = 31 * result + username.hashCode();
        return result;
    }
}

(2)后台校验Controller

package com.caox.controller;

/**
 * @author : nazi
 * @version : 1.0
 * @date : 2019/9/4 13:48
 */

import com.caox.model.UserInfo;
import com.caox.model.UserInfo.CHECK;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
public class ValidateController {
    @PostMapping(value="test")
    public void testStudent3(@RequestBody @Validated(CHECK.class) UserInfo userInfo,BindingResult result) {

        System.out.println("resolve this check success" + userInfo.getUserId());
        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append("\n");
        if (result.hasErrors()) {
            List list = result.getAllErrors();
            for (ObjectError error : list) {
                System.out.println(error.getCode() + "---" + error.getArguments() + "---" + error.getDefaultMessage());
                System.out.println(error.toString());
                sBuilder.append(error.getDefaultMessage());
                sBuilder.append("\n");
            }
        }
        System.out.println(sBuilder.toString());
    }
}

(3)如果校验参数不满足  checkParams() 函数的处理逻辑,则会返回如下异常 BindingResult:

可以将 BindingResult 返回给前端处理校验错误提示

你可能感兴趣的:(JAVA,WEB,参数校验,注解)