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

如何通过EnumUtils.isValidEnum校验枚举中存储的带空格文件名?

问题说明

已知EnumUtils.isValidEnum可用于枚举校验,但枚举常量名称无法包含空格,因此自定义了ModulacaoFilesEnum枚举,通过内部fileName属性存储带空格的文件名:

public enum ModulacaoFilesEnum {
    FILE001("FILE 001.xlsx"),
    FILE002("FILE 002.xlsx"),
    FILE003("FILE 003.xlsx");
    @Getter
    private final String fileName;

    ModulacaoFilesEnum(String fileName) {
        this.fileName = fileName;
    }
}

但使用如下代码校验文件原始文件名时无法实现需求,询问该方案是否可行及正确实现方式:

if (EnumUtils.isValidEnum(ModulacaoFilesEnum.class, file.getOriginalFilename())) {
    throw new NotModulacaoFileException(file);
}
问题原因

EnumUtils.isValidEnum的校验逻辑是将传入的字符串与枚举的常量名称(如FILE001)进行匹配,而非枚举类中自定义的fileName属性。你传入的是带空格的文件名(如FILE 001.xlsx),自然无法和枚举常量名匹配,所以校验失效。

可行方案及实现

这种自定义枚举存储业务属性的方案完全可行,以下是两种正确的校验方式:

方式一:在枚举类中新增静态校验方法

直接在ModulacaoFilesEnum里添加一个静态方法,遍历所有枚举实例匹配fileName:

public enum ModulacaoFilesEnum {
    FILE001("FILE 001.xlsx"),
    FILE002("FILE 002.xlsx"),
    FILE003("FILE 003.xlsx");
    @Getter
    private final String fileName;

    ModulacaoFilesEnum(String fileName) {
        this.fileName = fileName;
    }

    // 新增静态方法:校验文件名是否合法
    public static boolean isValidFileName(String fileName) {
        for (ModulacaoFilesEnum enumInst : values()) {
            if (enumInst.getFileName().equals(fileName)) {
                return true;
            }
        }
        return false;
    }
}

使用时直接调用该方法即可(注意原代码逻辑可能倒置,应该是不合法时抛出异常):

if (!ModulacaoFilesEnum.isValidFileName(file.getOriginalFilename())) {
    throw new NotModulacaoFileException(file);
}

方式二:结合EnumUtils与Stream流校验

如果想继续借助Apache Commons的EnumUtils,可以通过getEnumList获取枚举实例列表后,用Stream流过滤匹配:

boolean isValid = EnumUtils.getEnumList(ModulacaoFilesEnum.class)
    .stream()
    .anyMatch(enumInst -> enumInst.getFileName().equals(file.getOriginalFilename()));

if (!isValid) {
    throw new NotModulacaoFileException(file);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:20:43