You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring是否提供注解可校验请求参数属于预定义值集合?

Spring预定义集合值校验实现方案

Spring 本身没有内置专门校验值属于指定字符串集合的注解,但你可以通过两种简单方案实现需求,完全可以在请求进入 Controller 层时就完成校验,不用等到业务层处理。

方案1:自定义校验注解(推荐,复用性高)

这是生产环境最常用的实现方式,后续其他地方需要校验角色也可以直接复用注解:

  • 第一步:定义校验注解
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = RoleValidator.class)
public @interface ValidRole {
    String message() default "角色仅允许为user、admin、moderator三者之一";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
  • 第二步:实现校验逻辑
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.Set;

public class RoleValidator implements ConstraintValidator<ValidRole, String> {
    // 预定义允许的角色集合
    private static final Set<String> ALLOWED_ROLES = Set.of("user", "admin", "moderator");

    @Override
    public boolean isValid(String role, ConstraintValidatorContext context) {
        // 若允许空值可放开下行注释
        // if (role == null) return true;
        return ALLOWED_ROLES.contains(role);
    }
}
  • 第三步:Controller 层使用
    • 校验请求体 DTO 字段:在 DTO 对应字段加@ValidRole,同时 Controller 接口的 DTO 参数前加@Valid
    // DTO 定义
    public class RoleAssignDTO {
        @ValidRole
        private String role;
        // 其余字段、get/set 省略
    }
    
    // Controller 接口
    @PostMapping("/users/assign-role")
    public ResponseEntity<Void> assignRole(@RequestBody @Valid RoleAssignDTO dto) {
        // 业务逻辑省略
        return ResponseEntity.ok().build();
    }
    
    • 校验路径变量/请求参数:直接在参数上加@ValidRole,同时给 Controller 类上加@Validated
    @RestController
    @RequestMapping("/users")
    @Validated // 必须添加,否则方法参数上的校验注解不会生效
    public class UserController {
        @GetMapping("/list-by-role")
        public ResponseEntity<List<User>> listByRole(@RequestParam @ValidRole String role) {
            // 业务逻辑省略
            return ResponseEntity.ok(userService.listByRole(role));
        }
    }
    

方案2:使用@Pattern正则注解(快速实现,适合单次使用)

如果不想写自定义注解,也可以直接用 Jakarta Validation 自带的正则校验注解,直接加在对应字段上即可:

@Pattern(regexp = "^(user|admin|moderator)$", message = "角色仅允许为user、admin、moderator三者之一")
private String role;

内容的提问来源于stack exchange,提问作者Nutan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:45:03