目录
自定义注解类@AllowEmptyLength实现自定义校验规则
AllowEmptyLengthValidator实现这个自定义校验注解拦截功能可以实例化校验
前言
针对前面一篇文章说的,除了SpringBoot自带的一些校验注解,其实不能满足业务场景需要的,因为在开发过程中基本上,入参都是一个对象类,而不是一个参数,这样往下传递的,所以这样的场景,需要考虑到底是怎么样的传递来的。针对对象里面的参数我们如何实现自己的一个校验参数注解,自己自定义的实现,可以添加一个注解基于可以的实现所有的对象参数。这样应用通用性超级友好。维护性也很简单。定义也很简单。
自定义实现的参数对象校验举例
可以在前端接收到的对象参数进行添加注解即可的,主要的实现是如何定义以及实现这些注解,比如下面接受前端传来的一个通知对象,那么里面的参数基本上都是需要进行合格话校验的。
@Data
public class EventNoticeRequestVO implements Serializable {
@NotNull(message = "通知接收人ID不能为空")
private Integer receiverId;
@NotBlank(message = "通知信息不能为空")
// @Length(max = 500, message = "通知信息最多不超过500个字")
private String noticeMessage;
@AllowEmptyLength(max = 300, message = "跳转URL最多不超过300个字符")
private String url;
}
@AllowEmptyLengthValidator这个注解其实是自定义是实现的,那么这个注解是怎么实现和自定义的马?
自定义注解类@AllowEmptyLength实现自定义校验规则
这样既可以我这边使用,其他开发员,可以直接的使用这个注解皆可以的。通用型极高!
注解类的实现如下
@Constraint(validatedBy = { AllowEmptyLengthValidator.class })
@Documented
@Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface AllowEmptyLength {
int min() default 0;
int max() default Integer.MAX_VALUE;
String message() default "长度不合法";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
AllowEmptyLengthValidator实现这个自定义校验注解拦截功能
可以实例化校验
注解使用功能怎么样生效的呢?下面这个映射类就可以的,需要继承实现
ConstraintValidator
具体的实现java代码如下
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class AllowEmptyLengthValidator implements ConstraintValidator<AllowEmptyLength, String> {
private int min;
private int max;
@Override
public void initialize(AllowEmptyLength arg0) {
this.min = arg0.min();
this.max = arg0.max();
}
@Override
public boolean isValid(String arg0, ConstraintValidatorContext arg1) {
if (StringUtils.isBlank(arg0)) {
return true;
}
int strLen = arg0.trim().length();
if (strLen < min || strLen > max) {
return false;
}
return true;
}
}