自定义注解实现参数校验(通过@Valid触发)

实现对入参校验逻辑,
利用@Constraint绑定实现了ConstraintValidator接口的方法
注解Check.java

package com.snail.redisMemory.annotaion;
import com.snail.redisMemory.paramcheck.CheckType;

import java.lang.annotation.*;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 常用校验  枚举
 */
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = Check.CheckValidator.class)// 注意这里,指出了自定义的校验方法
public @interface Check {

    String message() default ""; // 自定义异常返回信息

    CheckType type(); // 自定义校验字段

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

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

    /**
     * 校验实现
     * 实现ConstraintValidator接口,这是个泛型接口,泛型中第一个是自定义的注解,第二个是注解使用的类型。
     * 这里就是我们调用的字段校验方法
     */
    class CheckValidator implements ConstraintValidator<Check,Object>{
        private CheckType type;

        @Override
        public void initialize(Check constraintAnnotation) {
            this.type=constraintAnnotation.type();
        }

        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            return CheckType.validate(type,value);
        }
    }
}

CheckType.java

package com.snail.redisMemory.paramcheck;

import java.text.SimpleDateFormat;
import java.util.regex.Pattern;

import org.springframework.util.StringUtils;

/**
 * 常用校验类型
 */
public enum CheckType {
    TOOLOOG_DATE("Date", "短日期格式", "yyyyMMddHHmmssSSS"),
    REQUEST_NO("RequestNo", "请求流水号", "^[0-9a-zA-Z]{32}");

    public String value;
    public String label;
    public String regular;

    private CheckType(String value, String label, String regular) {
        this.value = value;
        this.label = label;
        this.regular = regular;
    }

    /**
     * 校验方法
     * 验证传入的枚举值,是否符合规则
     * @param type
     * @return true:验证成功;false:验证失败
     */
    public static boolean validate(CheckType type, Object obj) {
        if (null == obj || null == type) {
            //空不校验
            return true;
        }
        if (!(obj instanceof String)) {
            //不是String 返回false
            return false;
        }
        String str = obj.toString();
        if (StringUtils.isEmpty(str)) {
            //空字符串不校验
            return true;
        }
        //日期格式不适用正则
        if ("Date".equals(type.value)) {
            SimpleDateFormat sdf = new SimpleDateFormat(type.regular);
            try {
                sdf.parse(str);
            } catch (Exception e) {
                return false;
            }
            return true;
        }
        //使用正则校验
        return Pattern.matches(type.regular, str);
    }
}

UserDto

package com.snail.redisMemory.paramcheck;

import java.io.Serializable;

import com.snail.redisMemory.annotaion.Check;
import lombok.Data;

@SuppressWarnings("serial")
@Data
public class UserDto implements Serializable{
    /**
     * 编码
     */
    @Check(type=CheckType.REQUEST_NO,message="编码格式错误")
    private String requestNo;

    @Check(type=CheckType.TOOLOOG_DATE,message="时间戳格式不正确,格式:yyyyMMddHHmmssSSS")
    private String timestamp;
}

最后写post方法调用

 @PostMapping("/check")
    public Object test(@RequestBody @Valid UserDto user) {
        return "";
    }

调用结果
在这里插入图片描述
涉及依赖,其中若不引用hibernate-validator,不会触发校验逻辑

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>2.0.1.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>6.0.15.Final</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.22</version>
		</dependency>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值