1 概述
后台单独对接收到的参数进行验证时比较麻烦,springboot项目的web组件(spring-boot-starter-web)集成了hibernate-validator,开发者可以直接使用hibernate-validator提供的注解对数据进行校验,当有一些复杂的参数校验时我们也可以自定义校验注解
2、先定义一个注解
package com.ideatech.ams.ws.validate; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = DateTimeValidator.class) public @interface DateTimeStr { String message() default "{javax.validation.constraints.DateTimeStr.message}"; String format() default "yyyy-MM-dd HH:mm:ss"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
@Constraint,指定校验类
message,失败提示信息
groups,分组验证(后面介绍)
payload,不知道,欢迎留言探讨
2、编写校验类
package com.ideatech.ams.ws.validate; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.lang.annotation.Annotation; import java.text.SimpleDateFormat; public class DateTimeValidator implements ConstraintValidator<DateTimeStr,String>{ private DateTimeStr dateTimeStr; @Override public void initialize(DateTimeStr dateTimeStr) { this.dateTimeStr=dateTimeStr; } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离 if (value == null) { return true; } String format = dateTimeStr.format(); if (value.length() != format.length()) { return false; } SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); try { simpleDateFormat.parse(value); } catch (Exception e){ return false; } return true; } }
1:必须实现ConstraintValidator接口
2:实现了ConstraintValidator接口后即使不进行Bean配置,spring也会将这个类进行Bean管理
3:可以在实现了ConstraintValidator接口的类中依赖注入其它Bean
4:实现了ConstraintValidator接口后必须重写 initialize 和 isValid 这两个方法;initialize方法主要来进行初始化,通常用来获取自定义注解的属性值;isValid 方法主要进行校验逻辑,返回true表示校验通过,返回false表示校验失败,通常根据注解属性值和实体类属性值进行校验判断
/** * 银行通知客户临柜时间(必填) */ @NotBlank(message="银行通知客户临柜时间不能为空") @DateTimeStr(format ="yyyy-MM-dd HH:mm:ss", message = "格式错误,正确格式为:yyyy-MM-dd HH:mm:ss") private String bankApplyTime;