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)); } } - 校验请求体 DTO 字段:在 DTO 对应字段加
方案2:使用@Pattern正则注解(快速实现,适合单次使用)
如果不想写自定义注解,也可以直接用 Jakarta Validation 自带的正则校验注解,直接加在对应字段上即可:
@Pattern(regexp = "^(user|admin|moderator)$", message = "角色仅允许为user、admin、moderator三者之一") private String role;
内容的提问来源于stack exchange,提问作者Nutan
相关产品推荐
相关产品推荐

