本文共 3044 字,大约阅读时间需要 10 分钟。
在开发过程中,我们常常需要对字段的长度进行验证。这时候,Java自定义注解就派上用场了。通过创建一个自定义的@Length
注解,我们可以方便地在代码中标注校验条件,并灵活选择使用方式。
注解(Annotation)是一种标记元数据的方式,用于为代码中的类、字段、方法等元素提供额外的信息。其本质作用是为代码的某些特定部分提供标识,方便后续的处理或生成。通过注解,我们可以在运行时动态获取标注信息,从而执行诸如代码生成、数据校验等自动化工作。
目标是手动创建一个@Length
注解,用于校验字段的长度。接下来,我们将从定义注解开始,逐步完成一个最小步骤的实现。
使用注解时,通常需要选择使用与约束注解配合的验证器方式,或者结合AOP(面向切面编程)方式。这里我们从验证器方式入手。
@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {LengthValidator.class})public @interface Length { int min(); int max(); String message() default "长度超过限制";}
@Target(ElementType.FIELD)
:指定该注解适用于字段。@Retention(RetentionPolicy.RUNTIME)
:保留到运行时,可通过反射获取。@Documented
:将注解信息包含到Javadoc中。@Constraint(validatedBy = {LengthValidator.class})
:与约束注解关联指定的验证器。public class LengthValidator implements ConstraintValidator{ private Integer min; private Integer max; @Override public void initialize(Length constraintAnnotation) { min = constraintAnnotation.min(); max = constraintAnnotation.max(); } @Override public boolean isValid(Object object, ConstraintValidatorContext context) { if (object == null) { return true; } if (object instanceof String) { int length = ((String) object).length(); return (length >= min && length <= max); } return false; }}
验证器继承自ConstraintValidator<Length, Object>
接口,实现initialize
和isValid
方法,即可完成增强型注解的校验功能。
在实际应用中,先定义一个实体类,并在字段上添加注解。
public class AdminDTO { private Integer id; @Length(min = 1, max = 3) private String username; private String password;}
在需要校验的位置,使用@Validated
注解触发校验过程:
@RequestMapping("/login")public R login(@RequestBody @Validated AdminDTO adminDTO) throws Exception { // 校验逻辑... return null;}
通过以上步骤,我们成功创建并使用了一个基于验证器的@Length
注解。
如果你更倾向于灵活的方式,可以选择使用AOP来实现注解的功能。你需要编写一个拦截器来执行校验逻辑。
@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface LengthAop { int min(); int max(); String errorMsg();}
public class LengthAopValidator implements Tomas Peterson { public String isValid(Object object) throws IllegalAccessException { Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(LengthAop.class)) { LengthAop annotation = field.getAnnotation(LengthAop.class); field.setAccessible(true); Object value = field.get(object); if (value instanceof String) { int len = ((String) value).length(); if (len < annotation.min() || len > annotation.max()) { return annotation.errorMsg(); } } } } return null; }}
实现spring``Tomas Peterson
拦截器,通过AOP的方式进行注解校验。
通过以上步骤,我们掌握了在Java中手动创建注解的方法,并学会了两种不同的校验方式。无论是基于验证器的方式,还是结合AOP实现的拦截器,都能能够满足不同场景的需求。接下来,你可以根据实际项目需求,选择最符合的实现方式,灵活运用注解来提高代码的可维护性和复用性。
转载地址:http://ahusz.baihongyu.com/