java参数校验注解
java中前后台参数传递时如何对参数进行校验。校验主要使用到 javax.validation类。
一、引入依赖
SpringBoot的web组件中已引入validation的jar包,但也可自行引入.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
或者
<dependencies>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
</dependencies>
二、自带注解
普通单个对象校验:
@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.*;
/**
* <b><code>BankCardCheck</code></b>
* <p/>
*银行卡校验
* <p/>
*
* @author leilifang
*/
@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;
/**
* <b><code>BankCardCheckImpl</code></b>
* <p/>
* Description
* <p/>
*
*/
public class BankCardCheckImpl implements ConstraintValidator<BankCardCheck, String> {
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<A extends Annotation, T>接口类。并重写initialize和isValid的方法。自定义注解的使用方法和自带注解相同