Java学习实例:注解

什么是注解(Annotation),注解是放在Java源码的类、方法、字段、参数前的一种特殊注释,比如我们常常使用的Spring Boot框架,经常会用到@NotNull, @NotEmpty, @NotBlank, 这些都是系统框架写好的注解, 接下来要做的是实现自己的注解

添加依赖

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

方式一:

import javax.validation.Constraint;
import javax.validation.OverridesAttribute;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.lang.annotation.*;

@ReportAsSingleViolation   //控制多个message的输出,只输出优先级高的message
@Documented                //注解可以写入用户文档中
@Constraint(validatedBy = { }) 
@Target({ElementType.METHOD, ElementType.FIELD}) //定义能够被应用的位置(类、方法、字段...)
@Retention(RetentionPolicy.RUNTIME) //注解的周期, 一般为运行期RUNTIME
@Repeatable(MyLength.List.class)    //定义是否可以重复
public @interface MyLength {
    String message() default "{length error}"; //输出的消息

    Class<?>[] groups() default {};            //分组验证

    Class<? extends Payload>[] payload() default {}; //验证一些元数据信息

    @OverridesAttribute(constraint = Max.class, name = "max") int max() default Integer.MAX_VALUE;

    @OverridesAttribute(constraint = Min.class, name = "min") int min() default 1;

    @Documented
    @Target({ElementType.METHOD, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface List {
        MyLength[] value();
    }

}

方式二

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import java.lang.annotation.*;

@ReportAsSingleViolation   //控制多个message的输出,只输出优先级高的message
@Documented                //注解可以写入用户文档中
@Constraint(validatedBy = MyLengthValidator.class)  //具体的实现
@Target({ElementType.METHOD, ElementType.FIELD}) //定义能够被应用的位置(类、方法、字段...)
@Retention(RetentionPolicy.RUNTIME) //注解的周期, 一般为运行期RUNTIME
@Repeatable(MyLength.List.class)    //定义是否可以重复
public @interface MyLength {
    String message() default "{length error}"; //输出的消息

    int length();

    Class<?>[] groups() default {};            //分组验证

    Class<? extends Payload>[] payload() default {}; //验证一些元数据信息

    @Documented
    @Target({ElementType.METHOD, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface List {
        MyLength[] value();
    }

}

实现具体的功能MyLengthValidator

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MyLengthValidator implements ConstraintValidator<MyLength, Object> {

    private int valueLength;

    @Override
    public void initialize(MyLength constraintAnnotation) {
        valueLength = constraintAnnotation.length();
    }

    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        String message = constraintValidatorContext.getDefaultConstraintMessageTemplate();
        if (o == null || o.toString().equals("")) {
            constraintValidatorContext.disableDefaultConstraintViolation(); //禁用默认的message值
            constraintValidatorContext.buildConstraintViolationWithTemplate(message+"不能为空").addConstraintViolation();
            return false;
        }
        if (o.toString().length() > valueLength) {
            constraintValidatorContext.disableDefaultConstraintViolation(); //禁用默认的message值
            constraintValidatorContext.buildConstraintViolationWithTemplate(message+"不能超过"+valueLength).addConstraintViolation();
            return false;
        }
        return true;
    }
}

以上就是两种自定义注解的实现方式,使用和@NotNull一样直接加在字段或者方法上面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值