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

如何验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:07:09