【SpringBoot】分组校验和自定义校验

分组检验

参数校验时,我们希望不同的方法参数校验规则不同,这时就需要分组校验。

public class Category {
    @NotNull(groups = Update.class)
    private Integer id;//主键ID
    @NotEmpty
    private String categoryName;//分类名称
    // @NotEmpty(groups = {Add.class, Update.class})
    @NotEmpty
    private String categoryAlias;//分类别名
    private Integer createUser;//创建人ID
    @JsonFormat(pattern = "yyyy-MM-dd MM:mm:ss")
    private LocalDateTime createTime;//创建时间
    @JsonFormat(pattern = "yyyy-MM-dd MM:mm:ss")
    private LocalDateTime updateTime;//更新时间
    public interface Add extends Default {

    }

    public interface Update extends Default {

    }

}

    @PostMapping
    public Result add(@RequestBody @Validated(Category.Add.class) Category category) {
        categoryService.add(category);
        return Result.success();
    }
    
    @PutMapping
    public Result update(@RequestBody @Validated(Category.Update.class) Category category) {
        categoryService.update(category);
        return Result.success();
    }

自定义校验

package com.heo.anno;

import com.heo.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented  // 元注解  抽取 State 到帮助文档内
@Constraint(
        validatedBy = {StateValidation.class}  // 指定校验规则的类
)
@Target({FIELD})  // 元注解 表明注解使用的场合 FIELD 表示 使用在属性上
@Retention(RUNTIME)  // 元注解 注解在哪个阶段会被保留
public @interface State {
    // 提供校验失败后的提示信息
    String message() default "state参数的值只能是已发布或者草稿";
    // 指定分组
    Class<?>[] groups() default {};
    // 负载 注解的附加信息
    Class<? extends Payload>[] payload() default {};
}

package com.heo.validation;

import com.heo.anno.State;
import jakarta.validation.Constraint;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * 自定义接口的校验规则类
 * State 给哪个注解提供校验规则
 * String 校验的数据类型
 */
public class StateValidation implements ConstraintValidator<State, String> {
    /**
     *
     * @param s 将来要校验的数据
     * @param constraintValidatorContext
     * @return 返回 false 校验不通过,true 则通过
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        // 提供校验规则
        if (s == null) {
            return false;
        }
        if (s.equals("已发布") || s.equals("草稿")) {
            return true;
        }
        return false;
    }
}

你可能感兴趣的:(SpringBoot,spring,boot,java,后端)