Spring Validator对 controller入参集合参数进行校验

我向 AI提的问题

现在有一个场景。使用 springboot写了一个接口,接口里面方法里面有一个入参是一个用户信息集合,用户信息里面有一个 type字段分别为 1 普通用户 2 会员 3 超级用户。现在需要对这个入参做参数校验。第一个校验是这个集合必须为 3 条数据。第二个校验是,更加不同的用户类型,用户的其他参数校验不一样。例如,普通用户的的电话可以为空,会员的电话不能为空。如果用 spring的校验框架该如何优雅的进行实现

Ai回答

在 Spring Boot 中,你可以使用 Spring 的校验框架(JSR 380,基于 javax.validation 和 Hibernate Validator)来实现基于用户类型的动态校验。以下是一个可能的解决方案:

1. 定义用户类并设置校验注解

首先,创建一个用户实体类,用于表示用户信息,并使用校验注解。

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class UserDTO {

    @NotNull(message = "Type cannot be null")
    private Integer type;

    private String phone;

    // Constructors, Getters, and Setters

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

2. 创建自定义校验注解

为了针对不同类型的用户实现不同的校验逻辑,可以创建一个自定义的校验注解。

自定义注解:


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

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UserValidator.class)
public @interface ValidUser {
    String message() default "Invalid user data";

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

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

自定义校验逻辑:


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

public class UserValidator implements ConstraintValidator<ValidUser, UserDTO> {

    @Override
    public boolean isValid(UserDTO user, ConstraintValidatorContext context) {
        if (user.getType() == null) {
            return false; // 基本类型不能为空
        }

        switch (user.getType()) {
            case 1: // 普通用户
                // 普通用户的电话可以为空,返回 true 表示校验通过
                return true;
            case 2: // 会员
                // 会员的电话不能为空
                if (user.getPhone() == null || user.getPhone().isEmpty()) {
                    context.disableDefaultConstraintViolation();
                    context.buildConstraintViolationWithTemplate("会员的电话不能为空")
                            .addPropertyNode("phone")
                            .addConstraintViolation();
                    return false;
                }
                return true;
            case 3: // 超级用户
                // 可以添加超级用户的其他校验逻辑
                return true;
            default:
                return false;
        }
    }
}

3. 集合校验

要验证用户集合的大小,可以在控制器入参上使用 @Size 注解,确保用户集合必须为 3 条数据。

java

import javax.validation.Valid;
import javax.validation.constraints.Size;
import java.util.List;

@RestController
public class UserController {

@PostMapping("/validateUsers")
public ResponseEntity<String> validateUsers(@RequestBody @Valid @Size(min = 3, max = 3, message = "用户集合必须为 3 条") List<@ValidUser UserDTO> users) {
    return ResponseEntity.ok("Validation passed");
}

}

4. 结果

这个实现中,Spring 的校验框架会自动校验集合长度,以及每个 UserDTO 的不同字段(例如,会员用户电话不能为空),如果校验不通过,会抛出 MethodArgumentNotValidException,你可以通过全局异常处理来捕获和处理这个异常。

这样可以优雅地使用 Spring 的校验框架,实现动态且复杂的校验逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

单线程bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值