java中前后台参数传递时如何对参数进行校验。校验主要使用到 javax.validation类。一、引入依赖
SpringBoot的web组件中已引入validation的jar包,但也可自行引入.
org.springframework.boot spring-boot-starter-validation
或者
二、自带注解javax.validation validation-api 2.0.1.Final
普通单个对象校验:
@Null 是否为null
@NotNull 是否不为null
@NotBlank 字符不为空,字符的长度不为0
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan校验:
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
对象大小校验:
@Size(min=, max=) 长度是否在范围之内
@Length(min=, max=) 长度是否在范围之内
日期校验:
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
数值校验:
PS:校验Excel时无法将数字转成String
@Min 验证 指定的最小值
@Max 验证指定的最大值
@DecimalMax 验证指定的最大带小数的值
@DecimalMin 验证 指定的最小带小数的值
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) 验证数字是否在指定范围内
@Range(min=10000,max=50000,message=“range.bean.wage”)
private BigDecimal wage;
其他校验:
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@scriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
model示例
@Data
public class GroupCameraVO {
@ApiModelProperty(value = "主键ID")
private Long id;
@ApiModelProperty(value = "分组编号")
private String groupSn;
@ApiModelProperty(value = "名称")
@NotBlank(message = "分组名称不能空")
private String name;
}
controller示例:使用@Validated注解,表明该对象需要进行校验
@PostMapping
public ResponseVO> save(@RequestBody @Validated OrderProductSaveVO orderProductSaveVo){
Boolean f=orderProductsService.saveOrderProduct(orderProductSaveVo);
return f?ResponseVO.success("新增成功"):ResponseVO.error(HttpStatus.INTERNAL_SERVER_ERROR,"新增失败","");
}
三、自定义校验注解
在javax.validation类自带的注解无法满足我们的校验时,使用自定义注解实现,主要通过元注解中的注解去实现注解的生成,元注解的类在 java.lang.annotation 包中。注解的接口message可定义校验失败后报的错误
import com.richstonedt.cmp.model.validation.impl.BankCardCheckImpl;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target( {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = BankCardCheckImpl.class)
@documented
public @interface BankCardCheck {
String message() default "格式错误";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}
其中BankCardCheckImpl为该注解的实现类
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.lang.annotation.Annotation; import java.util.regex.Pattern; public class BankCardCheckImpl implements ConstraintValidator{ private final static String REGEX_BANKCRAd = "^(\d{16}|\d{17}|\d{18}|\d{19}|\d{20}|\d{21})$"; @Override public void initialize(BankCardCheck arg0) { } @Override public boolean isValid(String arg0, ConstraintValidatorContext arg1) { if (arg0==null||arg0.equals("")){ return true; } if(Pattern.matches(REGEX_BANKCRAd,arg0)){ return true; } return false; } }
实现类中最关键的是实现ConstraintValidator接口类。并重写initialize和isValid的方法。自定义注解的使用方法和自带注解相同



