如何验证REST端点中传入的枚举类型参数合法性?
枚举参数合法性验证的实现方案
首先先修正你提供的枚举类中的小错误:构造方法名应该是Day而非Event,否则代码无法编译,修正后的基础枚举类如下:
public enum Day { MONDAY("01"), TUESDAY("02"), WEDNESDAY("03"), THURSDAY("04"), FRIDAY("05"), SATURDAY("06"), SUNDAY("07"); private final String value; private Day(String value) { this.value = value; } }
下面提供三种实用的验证方案,适配不同场景:
方案一:枚举内置静态校验方法(通用场景)
直接在枚举类中添加静态方法,用于校验传入的字符串是否匹配枚举的value值,逻辑简单直接,无需依赖其他框架。
先给枚举添加value的getter和校验方法:
public enum Day { MONDAY("01"), TUESDAY("02"), WEDNESDAY("03"), THURSDAY("04"), FRIDAY("05"), SATURDAY("06"), SUNDAY("07"); private final String value; private Day(String value) { this.value = value; } public String getValue() { return value; } // 静态校验方法:判断传入字符串是否为合法枚举值 public static boolean isValid(String value) { if (value == null || value.isBlank()) { return false; } for (Day day : Day.values()) { if (day.getValue().equals(value)) { return true; } } return false; } }
在Controller中调用校验:
@RestController @RequestMapping("/demo") public class DemoController { @GetMapping("/check-day") public ResponseEntity<String> checkDay(@RequestParam String dayParam) { if (!Day.isValid(dayParam)) { return ResponseEntity.badRequest().body("非法日期参数,合法值为01-07"); } // 参数合法,执行后续业务逻辑 return ResponseEntity.ok("参数校验通过"); } }
方案二:自定义校验注解(Spring Boot项目推荐)
如果是Spring Boot项目,用自定义校验注解能和Spring的校验生态整合,实现自动校验、统一异常处理,代码更优雅。
1. 定义校验注解
import jakarta.validation.Constraint; import jakarta.validation.Payload; import java.lang.annotation.*; @Target({ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = DayValidator.class) public @interface ValidDay { String message() default "非法日期参数,合法值为01-07"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2. 实现校验器逻辑
import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; public class DayValidator implements ConstraintValidator<ValidDay, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 若允许参数为空,这里返回true;若不允许为空,返回false if (value == null || value.isBlank()) { return true; } return Day.isValid(value); } }
3. Controller中启用校验
记得在Controller类上添加@Validated注解开启参数校验:
@RestController @RequestMapping("/demo") @Validated // 必须添加此注解才能启用Spring参数校验 public class DemoController { @GetMapping("/check-day") public ResponseEntity<String> checkDay(@RequestParam @ValidDay String dayParam) { // 参数合法时执行业务逻辑 return ResponseEntity.ok("参数校验通过"); } }
当传入非法参数时,Spring会自动抛出ConstraintViolationException,你可以通过全局异常处理器捕获该异常,返回统一格式的错误响应。
方案三:枚举转换+异常捕获(适合需要直接使用枚举实例的场景)
如果业务中需要将参数直接转换为Day枚举实例,可以给枚举添加转换方法,转换失败时抛出异常,在Controller中捕获异常判定参数非法:
public enum Day { MONDAY("01"), TUESDAY("02"), WEDNESDAY("03"), THURSDAY("04"), FRIDAY("05"), SATURDAY("06"), SUNDAY("07"); private final String value; private Day(String value) { this.value = value; } public String getValue() { return value; } // 将字符串转换为Day枚举,失败则抛出非法参数异常 public static Day fromValue(String value) { if (value == null || value.isBlank()) { throw new IllegalArgumentException("日期参数不能为空"); } for (Day day : Day.values()) { if (day.getValue().equals(value)) { return day; } } throw new IllegalArgumentException("非法日期参数:" + value + ",合法值为01-07"); } }
Controller中使用:
@RestController @RequestMapping("/demo") public class DemoController { @GetMapping("/check-day") public ResponseEntity<String> checkDay(@RequestParam String dayParam) { try { Day day = Day.fromValue(dayParam); // 转换成功,参数合法,可直接使用day实例 return ResponseEntity.ok("参数校验通过,对应日期:" + day.name()); } catch (IllegalArgumentException e) { return ResponseEntity.badRequest().body(e.getMessage()); } } }
内容的提问来源于stack exchange,提问作者AmolRavan
相关产品推荐
相关产品推荐

