关于Validated:使用自定义注解实现校验规则

@Validated提供了一些已经封装好可以直接使用的注解,如:@NotEmpty--->(非空,多用于集合)、@NotNull--->(非空,用在基本类型上)、@URL--->(校验参数是否为url格式)、@Email--->(校验参数是否为邮箱格式)、@Pattern--->(再regext写入正则表达式进行校验)。

自定义校验规则
以校验参数只能是已发布和草稿为例

1、找到已经封装好的注解,下面Empty为例:

package jakarta.validation.constraints;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
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;

@Documented
@Constraint(
    validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(List.class)
public @interface NotEmpty {
    String message() default "{jakarta.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();
    }
}

我们对器其进行粘贴修改,自定义一个@State注解

import java.lang.annotation.*;

/**
 * @param
 * @return
 */
@Documented//元注解
@Target({ ElementType.FIELD})//元注解
@Retention(RetentionPolicy.RUNTIME)//元注解
@Constraint(
        validatedBy = {StateValidation.class}
)//指定提供校验规则的类

public @interface State {
        //校验不通过返回的错误信息
        String message() default "state提供的参数必须是“草稿”或“已发布”";
        //指定分组
        Class<?>[] groups() default {};

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

2、然后对此注释添加一个校验规则类(继承ConstraintValidator<State, String>,其中State是自定义的注释类,String是校验类型)

package com.example.bigevent.validation;

import com.example.bigevent.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * @param
 * @return
 */
public class StateValidation implements ConstraintValidator<State, String> {

    /**
     * @param s//将来要校验的参数
     * @param constraintValidatorContext
     * @return true则校验通过,false则校验不通过
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s.isEmpty()) {
            return false;
        }
        if (s.equals("草稿") || s.equals("已发布")) {
            return true;
        }
        return false;
    }
}

3、在需要的地方添加@State即可,下面是总体结构

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值