Validation--自定义校验

目录

1.自定义注解

2.自定义校验数据的类实现ConstrainValidator接口

3.在需要校验的地方使用自定义注解


前言:

今天学到这个,闲着也是闲着,就写一个记录一下,也算是总结

我们的步骤是这样的

1.自定义注解State
2.自定义校验数据的类StateValidation实现ConstrainValidator接口
3.在需要校验的地方使用自定义注解

1.自定义注解

这边以State为例,创建注解

参考@NotEmpty设计我们的注解

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.validation.constraints;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Constraint(
    validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotEmpty.List.class)
public @interface NotEmpty {
    String message() default "{javax.validation.constraints.NotEmpty.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface List {
        NotEmpty[] value();
    }
}

这边我把比较有用的博客给找出来,有空可以看看

@Documented注解的作用-CSDN博客

java常见的注解之 @Target-CSDN博客

@Retention注解详解-CSDN博客

java中@Repeatable的理解-CSDN博客@Repeatable-CSDN博客

使用中最为关键的

Spring注解之——@Constraint 自定义约束注解-CSDN博客

这边我们不使用@Repeatable与@Retention(使用默认的class作用范围)

package com.yjzx.anno;

import com.yjzx.validation.StateValidation;

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

@Target({ElementType.FIELD})//元注解
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {StateValidation.class}//指定要识别的类
)
public @interface State {
    //提供校验失败后的提示信息
    String message() default "state参数的值只能是已发布或者草稿 ";
    //指定分组
    Class<?>[] groups() default {};
    //负载,获取State注解附加信息
    Class<? extends Payload>[] payload() default {};

}

2.自定义校验数据的类实现ConstrainValidator接口

这边使用StateValidation实现,并继承isValid方法

package com.yjzx.validation;

import com.yjzx.anno.State;

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

public class StateValidation implements ConstraintValidator<State,String> {

    /**
     *
     * @param s 将来要校验的数据
     * @param constraintValidatorContext
     * @return  若返回false则不通过,true校验通过
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        //提供校验规则
        if(s==null){
            return false;
        }
        if(s.equals("已发布")||s.equals("草稿")){
            return true;
        }
        return false;
    }
}

3.在需要校验的地方使用自定义注解

像这样,因为我设置的@Target是字段、枚举的常量,可以这么使用,其他请去上面找一下

@Target({ElementType.FIELD})
 @State
    private String state;//发布状态 已发布|草稿

 结果的话,我这边插一个出错的截图吧

 就是这样,如果是对的就正常运行

结束。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篆愁君的烦恼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值