java-springboot-参数验证validation,允许传入code值某些值如:“ACCEPT,REJECT“

文章介绍了在SpringBoot项目中,如何基于spring-boot-starter-validation进行参数校验,特别是针对前端传入的枚举或常量字段的校验。作者自定义了一个AllowValue注解,用于验证参数是否为预设的值。在验证实现类中,解析并比较传入参数,如果不符合规定值则返回错误信息。文章还给出了一个实际使用示例,用于数据审核接口的审核状态校验。

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


前言

提示:参数校验我们是基于spring-boot-starter-validation来做的,但是允许传入某些参数的校验需要我们自定义
怎么引入spring-boot-starter-validation,参考之前的文章点这里

一、场景

经常我们需要前端传入一些定义的枚举或者常量的字段,后台需要对传入的字段进行校验,验证传入参数是不是之前约定好的。

二、自定义AllowValue校验

自定义注解

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = AllowValueImpl.class)
public @interface AllowValue {
    Class<?>[] groups() default {};

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

    String message() default "not allow value";

    String value();

    boolean required() default false;
}

验证实现类

public class AllowValueImpl implements ConstraintValidator<AllowValue, Object> {
    private String value;
    private boolean required;

    @Override
    public void initialize(AllowValue constraint) {
        this.value = constraint.value();
        this.required = constraint.required();
    }

    @Override
    public boolean isValid(Object obj, ConstraintValidatorContext context) {
        if (null != obj) {
            if (StringUtils.isNotEmpty(value)) {
                String[] split = value.split(",");
                if (split.length > 0) {
                    for (String s : split) {
                        if (obj instanceof String){
                            if (s.equals(obj)) {
                                return true;
                            }
                        }else if (obj instanceof Integer){
                            if ((obj).equals(Integer.parseInt(s))){
                                return true;
                            }
                        }
                    }
                }
            }
        } else {
            return required?false:true;
        }
        return false;
    }
}

isValid 方法返回true或者false 如果为false时会将message错误信息返回出来。

二、实际使用

场景:我们需要前端调用接口进行数据审核,我们定义了两个code

  • ACCEPT 审核通过
  • REJECT 审核驳回
@Data
@EqualsAndHashCode(callSuper = false)
public class CompanyAttributeApprovalDto {
	@NotNull
	private Long id;
	@NotNull
	@AllowValue(value = "ACCEPT,REJECT",message = "审核状态错误")
	private String auditStatus;
	private String rejectReason;
}

controler


    @PostMapping("/approval")
    public CommonResult<Boolean> approval(@RequestBody @Valid CompanyAttributeApprovalDto approvalDto){
       // 通过或驳回
        return CommonResult.Success(true);
    }

controler接收到参数时会校验,传入的参数是否符合@AllowValue注解的value中约定的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值