如何通过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
相关产品推荐
相关产品推荐

