前言
在 Java 中,可以使用 javax.validation 提供的注解来实现数据的校验。javax.validation 提供了很多内置的校验规则,如 @NotNull、@Size、@Email 等,但有时候我们需要自定义校验规则来满足特定的业务需求。
代码示例
代码如下:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = MyValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String message() default "Invalid input";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
在这个示例中,我们定义了一个名为 MyAnnotation
的注解,用于自定义校验规则。注解中包含了以下内容:
@Documented
:表示该注解会被文档化,在生成的 API 文档中会显示该注解。@Constraint(validatedBy = MyValidator.class)
:表示该注解是一个校验注解,需要使用MyValidator
类来进行校验。@Target( { ElementType.METHOD, ElementType.FIELD })
:表示该注解可以用于方法上或者字段上。@Retention(RetentionPolicy.RUNTIME)
:表示该注解在运行时可见。public
:表示该注解是 public 访问权限。interface
:表示该注解是一个接口。
具体实现
以下是一个示例,用于验证字符串只包含中英文、数字或者下划线:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = {})
@Target( { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomValidation {
String message() default "输入只允许中英文、数字或者下划线";
Class<?>[] groups() default {};
Payload payload() default {};
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CustomValidationValidator implements ConstraintValidator<CustomValidation, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
for (int i = 0; i < value.length(); i++) {
char c = value.charAt(i);
if (!Character.isLetterOrDigit(c) && c != '_') {
return false;
}
}
return true;
}
}
public class User {
@CustomValidation
private String name;
// 其他字段和getter/setter方法...
}
创建一个新的User
实例并设置name
字段时,自定义验证将检查该字段是否只包含中英文、数字或者下划线。如果验证失败,将抛出ConstraintViolationException
异常。