自定义注解
package com.nobody.annotation;
import com.nobody.validator.isleekvalidator;
import javax.validation.constraint;
import javax.validation.payload;
import java.lang.annotation.*;
@retention(retentionpolicy.runtime)
@target(elementtype.field)
@documented
@constraint(validatedby = isleekvalidator.class) // 指定我们自定义的校验类
public @interface isleek {
/**
* 是否强制校验
*
* @return 是否强制校验的boolean值
*/
boolean required() default true;
/**
* 校验不通过时的报错信息
*
* @return 校验不通过时的报错信息
*/
string message() default "校验错误!";
/**
* 将validator进行分类,不同的类group中会执行不同的validator操作
*
* @return validator的分类类型
*/
class<?>[] groups() default {};
/**
* 主要是针对bean,很少使用
*
* @return 负载
*/
class<? extends payload>[] payload() default {};
}
实现自定义注解
package com.nobody.validator;
import com.nobody.annotation.isleek;
import org.springframework.util.stringutils;
import javax.validation.constraintvalidator;
import javax.validation.constraintvalidatorcontext;
public class isleekvalidator implements constraintvalidator<isleek, string> {
// 是否强制校验
private boolean required;
@override
public void initialize(isleek constraintannotation) {
this.required = constraintannotation.required();
}
@override
public boolean isvalid(string name, constraintvalidatorcontext constraintvalidatorcontext) {
if (required) {
return !stringutils.isempty(name) && name.startswith("hello");
}
return false;
}
}
使用自定义注解
package com.nobody.dto;
import com.nobody.annotation.isleek;
import lombok.data;
import javax.validation.constraints.*;
@data
public class userdto {
@notblank(message = "姓名不能为空")
@isleek // 我们自定义的注解
private string name;
@min(value = 18, message = "年龄不能小于18")
private int age;
@notempty(message = "邮箱不能为空")
@email(message = "邮箱格式不正确")
private string email;
}
写个接口,模拟用户开户业务,调用测试。注意,记得加上@valid注解开启校验,不然不生效。
如果参数校验不通过,会抛出methodargumentnotvalidexception异常。