当前位置:

首页 > 编程开发 > Spring REST 安全校验枚举参数方法

Spring REST 安全校验枚举参数方法

本文介绍如何在SpringBootREST端点中对传入的字符串型参数(如"01"、"02")进行严格枚举校验,确保仅接受预定义的合法值(如Day.MONDAY→"01"),拒绝非法输入(如"09"),并提供可复用的类型安全解决方案。

如何在 Spring REST 接口中安全校验枚举型请求参数(字符串映射)

本文介绍如何在 Spring Boot REST 端点中对传入的字符串型参数(如 "01"、"02")进行严格枚举校验,确保仅接受预定义的合法值(如 Day.MONDAY → "01"),拒绝非法输入(如 "09"),并提供可复用的类型安全解决方案。

本文介绍如何在 Spring Boot REST 端点中对传入的字符串型参数(如 "01"、"02")进行严格枚举校验,确保仅接受预定义的合法值(如 Day.MONDAY → "01"),拒绝非法输入(如 "09"),并提供可复用的类型安全解决方案。

在实际开发中,前端常以固定格式字符串(如两位数字编码 "01")传递业务含义明确的参数,而后端需将其安全映射为 Java 枚举。但 Spring 默认的 @RequestParam 或 @PathVariable 绑定不支持直接按 value 字段反向解析枚举——若仅依赖 Day.valueOf("01") 会抛出 IllegalArgumentException(因枚举名是 MONDAY,非 "01"),且缺乏统一的校验入口。

✅ 正确做法:自定义 Converter + @Validated + @Pattern/自定义注解,实现类型安全、可复用、可扩展的校验链。

✅ 推荐方案:基于 Converter 的声明式校验

首先修正枚举构造函数名(原代码中误写为 Event,应为 Day)并添加静态查找方法:

public enum Day {
    MONDAY("01"),
    TUESDAY("02"),
    WEDNESDAY("03"),
    THURSDAY("04"),
    FRIDAY("05"),
    SATURDAY("06"),
    SUNDAY("07");

    private final String value;

    Day(String value) { // 修正构造函数名
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    // 安全查找:返回 Optional 避免 NPE
    public static Optional fromValue(String value) {
        for (Day day : Day.values()) {
            if (day.value.equals(value)) {
                return Optional.of(day);
            }
        }
        return Optional.empty();
    }
}

接着,注册一个 Spring Converter,将字符串自动转换为 Day,并在转换失败时抛出带语义的异常:

@Component
public class StringToDayConverter implements Converter {
    @Override
    public Day convert(String source) {
        if (source == null || source.trim().isEmpty()) {
            throw new IllegalArgumentException("Day parameter cannot be null or empty");
        }
        return Day.fromValue(source.trim())
                .orElseThrow(() -> new IllegalArgumentException(
                        "Invalid Day value: '" + source + "'. Allowed: 01-07"));
    }
}

在 WebMvcConfigurer 中注册该转换器(Spring Boot 2.6+ 可省略,自动扫描 @Component):

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToDayConverter());
    }
}

最后,在 Controller 中直接使用,Spring 将自动完成转换与校验:

@RestController
@RequestMapping("/api")
public class DayController {

    @GetMapping("/schedule")
    public ResponseEntity getSchedule(@RequestParam Day day) {
        return ResponseEntity.ok("Selected day: " + day.name() + " (" + day.getValue() + ")");
    }
}

✅ 效果验证:

  • ✅ /api/schedule?day=01 → 返回 MONDAY (01)
  • ✅ /api/schedule?day=07 → 返回 SUNDAY (07)
  • ❌ /api/schedule?day=09 → 抛出 IllegalArgumentException,HTTP 400 响应体含清晰错误信息

⚠️ 注意事项与最佳实践

  • 不要依赖 Integer.parseInt() 后匹配序号:原始答案建议“转为数字再校验 1–7”,虽可行但破坏了枚举的语义封装性,且无法处理非连续编号(如 "01", "03", "10");
  • 避免在 Controller 内手动 try-catch 解析:违背关注点分离,重复代码且难以全局统一错误响应格式;
  • 生产环境建议配合全局异常处理器,将 IllegalArgumentException 映射为标准 JSON 错误响应(如 {"error": "Invalid Day value: '09'"});
  • 若需支持多语言或更复杂校验逻辑(如权限级校验),可升级为 @Constraint 自定义注解 + ConstraintValidator。

通过以上设计,你获得了一个零侵入、可测试、易维护、符合 Spring 生态规范的枚举参数校验方案——既保障 API 健壮性,又提升团队协作效率。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
调整Windows10开始菜单宽度的简单方法
调整Windows10开始菜单宽度的简单方法

想知道 Windows 10 开始菜单太窄或太宽怎么办?只需打开菜单,将鼠标移至右侧边缘即可自由拖动调整。本文详解操作步骤、磁贴排列技巧及全屏模式等影响因素,助你定制专属开始界面。

Word空白页按退格键无效怎么办
Word空白页按退格键无效怎么办

遇到Word空白页按退格键无效的情况?这通常不是软件故障,而是由分页符、分节符或表格后不可见的段落标记导致。本文教你打开编辑标记,精准定位并删除这些隐藏元素,同时保留必要的文档版式。

Windows12需要独立显卡吗?办公和游戏需求分别怎么看
Windows12需要独立显卡吗?办公和游戏需求分别怎么看

Windows12是否必须配备独立显卡?本文从办公日常使用与游戏高性能需求两个维度,分析核显与独显的适用场景,提供查看显卡状态、核对系统要求及解决图形兼容问题的实操指南。

怎么让Windows10为每个应用窗口使用不同输入法
怎么让Windows10为每个应用窗口使用不同输入法

解决 Windows 10 切换窗口时输入法自动跳变的问题。只需在高级键盘设置中勾选对应选项,即可让记事本、浏览器等应用分别记住各自的输入法状态,无需每次手动切换。

PDF转PPT如何避免转完变成图片无法编辑?PDF转PPT免费的工具哪个好用?
PDF转PPT如何避免转完变成图片无法编辑?PDF转PPT免费的工具哪个好用?

PDF转PPT是否可编辑取决于源文件结构。文章说明免费在线转换步骤、扫描件判断、文本框与图片检查方法,并给出无法编辑时的处理建议。

如何使用讯飞绘文 AI 配图功能
如何使用讯飞绘文 AI 配图功能

学习如何在讯飞绘文中使用 AI 配图功能。通过确定配图服务段落、编写具体画面提示词、检查生成结果及调整版式版权,确保图片准确解释正文内容,提升文章可读性。

Windows12配置要求公布了吗?微软官方规格去哪里查
Windows12配置要求公布了吗?微软官方规格去哪里查

Windows 12配置要求尚未完全定型,网传参数需谨慎对待。本文详解如何通过微软官网获取权威规格,并利用msinfo32等系统工具自查本机硬件与固件状态,确保升级决策基于准确信息。

Windows12对UEFI和安全启动有什么要求?BIOS检查教程
Windows12对UEFI和安全启动有什么要求?BIOS检查教程

想了解电脑是否满足未来 Windows 12 的潜在硬件要求?本文教你通过系统信息和磁盘管理查看 UEFI、GPT 分区及安全启动状态,并提供进入 BIOS 检查 TPM 和 Secure Boot 的详细步骤。注意:修改设置前请务必备份数据。

Windows10输入法候选词数量如何调整
Windows10输入法候选词数量如何调整

在 Windows 10 中,Microsoft 拼音输入法的候选词数量会影响输入效率。本文详解如何通过系统设置调整每页显示的候选项数,并解决设置不生效或选项缺失的常见问题。

怎么在讯飞绘文选择合适生成模型
怎么在讯飞绘文选择合适生成模型

在讯飞绘文中,如何根据写短文、理长文或配图排版等不同需求选择模型?本文从任务判断、页面说明查看、小样本对比和工作流配置四个方面,提供朴素直接的界面导览与选择建议。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
AirBuddy 3 macOS版
AirBuddy 3 macOS版
macOS

AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

AirServer macOS版
AirServer macOS版
macOS

AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

AnyDesk macOS版
AnyDesk macOS版
macOS

AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

WINDOWS 更多
Fuzor Windows版
Fuzor Windows版
Windows

Fuzor Windows版是一套面向建筑、工程与施工团队的BIM/VDC平台,可汇集多来源模型和进度数据,完成实时可视化、4D施工推演、场地物流规划、问题检查、成果演示及团队协同。

Gety Windows版
Gety Windows版
Windows

Gety Windows版是一款本地AI文件搜索工具,可索引电脑中的文档和图片,通过全文搜索、语义检索与OCR快速定位内容,并提供原版式预览、筛选和AI工具连接功能。

iMazing Windows版
iMazing Windows版
Windows

iMazing Windows版是一款面向iPhone、iPad和iPod用户的本地设备管理工具,可在电脑上完成多版本备份、照片与音乐传输、信息导出、应用数据管理以及新旧设备迁移。