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的方法。自定义注解的使用方法和自带注解相同

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐