自定义校验传参注解-解决特定传参校验解决方案

本文介绍了一种通过自定义注解实现特定传参校验的方法。包括整型和字符串类型的必填与非必填参数校验,以及JSON格式字符串的校验。并通过一个具体的例子展示了如何使用这些自定义注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义注解实现特定传参校验

Y. pom引用包
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.18.Final</version>
</dependency>

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
E. 实现body参数校验
E-Y. 实现限定必传且限定参数传参

根据业务需求设定,限定传参校验实现
代码如下:
定义In注解

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

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {InValidator.class}
)
public @interface In {
    String message() default "The value is not within a given range.";
    int[] values() default {};
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现In注解逻辑代码

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

public class InValidator implements ConstraintValidator<In, Integer> {
    private int[] checkedValues;
    public InValidator() {
    }
    public void initialize(In constraintAnnotation) {
        this.checkedValues = constraintAnnotation.values();
    }
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        } else {
            int[] var3 = this.checkedValues;
            int var4 = var3.length;
            for(int var5 = 0; var5 < var4; ++var5) {
                Integer checkedValue = var3[var5];
                if (value.equals(checkedValue)) {
                    return true;
                }
            }
            return false;
        }
    }
}
E-E. 实现字符串传参非必填且限定参数

根据业务需求设定,限定传参校验实现
代码如下:
定义InOrNull注解

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

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {InOrNullValidator.class}
)
public @interface InOrNull {
    String message() default "The value is not within a given range or null.";
    String[] values() default {};
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现InOrNull注解逻辑代码

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class InOrNullValidator implements ConstraintValidator<InOrNull, String> {
    private String[] checkedValues;
    public InOrNullValidator() {
    }
    public void initialize(InOrNull constraintAnnotation) {
        this.checkedValues = constraintAnnotation.values();
    }
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        } else {
            String[] var3 = this.checkedValues;
            int var4 = var3.length;
            for(int var5 = 0; var5 < var4; ++var5) {
                String checkedValue = var3[var5];
                if (value.equals(checkedValue)) {
                    return true;
                }
            }
            return false;
        }
    }
}
E-S. 实现整型传参非必填且限定参数

根据业务需求设定,限定传参校验实现
代码如下:
定义InOrNull4Integer注解

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

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {InOrNull4IntegerValidator.class}
)
public @interface InOrNull4Integer {
    String message() default "The value is not within a given range or null.";
    int[] values() default {};
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现InOrNull4Integer注解逻辑代码

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class InOrNull4IntegerValidator implements ConstraintValidator<InOrNull4Integer, Integer> {
    private int[] checkedValues;

    public InOrNull4IntegerValidator() {
    }
    public void initialize(InOrNull4Integer constraintAnnotation) {
        this.checkedValues = constraintAnnotation.values();
    }
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        } else {
            int[] var3 = this.checkedValues;
            int var4 = var3.length;
            for(int var5 = 0; var5 < var4; ++var5) {
                Integer checkedValue = var3[var5];
                if (value.equals(checkedValue)) {
                    return true;
                }
            }
            return false;
        }
    }
}
E-S . 实现JSON字符串传参非必填且限定JSON格式

根据业务需求设定,限定传参校验实现
代码如下:
定义JsonValid注解

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

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {JsonValidValidator.class}
)
public @interface JsonValid {
    String message() default "Illegal json formatted string.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现JsonValid注解逻辑代码

import com.mws.onepagebook.core.common.util.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class JsonValidValidator implements ConstraintValidator<JsonValid, String> {
    public JsonValidValidator() {
    }

    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null) {
            return true;
        } else if (StringUtils.equals("", value)) {
            return false;
        } else {
            try {
                ObjectMapper mapper = new ObjectMapper();
                mapper.readTree(value);
                return true;
            } catch (IOException var4) {
                return false;
            }
        }
    }
}
S.测试

S-Y. 定义Dto参数

import com.mws.onepagebook.core.common.validator.In;
import com.mws.onepagebook.core.common.validator.InOrNull;
import com.mws.onepagebook.core.common.validator.InOrNull4Integer;
import com.mws.onepagebook.core.common.validator.JsonValid;
import lombok.Data;
import org.springframework.validation.annotation.Validated;

import java.io.Serializable;

@Validated
@Data
public class Param implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 编号 varchar
     */
    @In(values = {10, 20, 30}, message = "编号传值不正确")
    private Integer orderNo;

    /**
     * 单号 varchar
     */
    @InOrNull(values = {"H10", "H20", "H30"}, message = "单号传值不正确")
    private String expressNo;


    /**
     * 类型 Integer
     */
    @InOrNull4Integer(values = {10, 20, 30}, message = "类型传值不正确")
    private Integer type;

    /**
     * ext json
     */
    @JsonValid(message = "ext参数非Json串")
    private String ext;

}

@RequestMapping("/param")
public class ParamController {

    @PostMapping(value = "/info",produces = MediaType.APPLICATION_JSON_VALUE)
    public Param info(@Valid @RequestBody Param param){
        System.out.println(param);
        return param;
    }
}

请求测试

在这里插入图片描述

localhost:8080/param/info
传参
{
“orderNo”:10, //必传 根据values定义传值
“expressNo”:“H10”, //非必传 根据values定义传值
“type”:20,//非必传 根据values定义传值
“ext”:“{}”//非必传 传值必须是json字符串
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值