千家信息网

springboot怎么实现枚举类型传递

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"springboot怎么实现枚举类型传递",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"springboot怎么实现枚举类型传递"吧
千家信息网最后更新 2026年11月03日springboot怎么实现枚举类型传递

这篇文章主要讲解了"springboot怎么实现枚举类型传递",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"springboot怎么实现枚举类型传递"吧!

测试

首先先建立一个枚举类:

public enum ScoreType  {    TOTAL_SCORE("总评成绩"),    MIDDLE_SCORE("期中成绩"),    FINAL_SCORE("期末成绩");    String des; // 描述    ScoreType(String des) {        this.des = des;    }    public String getDes() {        return des;    } }

再建立一个枚举api接口:

@RestController@RequestMapping("/Klass")public class KlassController {    @GetMapping("testEnum")    public String testEnum(@RequestParam ScoreType scoreType) {        return "枚举序号:" + scoreType.ordinal() + ",枚举名:" + scoreType.name();    }}

进行测试,使用枚举名发送数据:

使用枚举序号发送数据:

由此可见,在springboot默认请求参数映射中,枚举类型只能通过枚举名来进行参数映射,但有时候我们需要用序号来做映射。

Converter

顾明思议Converter就是转换的意思,我们可以通过定义的Converter来确定参数到枚举类型之间的转换:

public class BaseEnumConverter implements Converter {    private Map enumMap = new HashMap<>();    public BaseEnumConverter(Class enumType) {        T[] enums = enumType.getEnumConstants();        for (T e : enums) {            enumMap.put(String.valueOf(e.ordinal()), e);            enumMap.put(e.name(), e);        }    }    @Override    public T convert(String source) {        T t1 = enumMap.get(source.toLowerCase());        T t2 = enumMap.get(source.toUpperCase());        if (t1 == null && t2 == null) {            throw new IllegalArgumentException("无法匹配对应的枚举类型");        }        return t1 == null ? t2 : t1;    }}

分析代码,根据运行时具体枚举类的参数,获取所有枚举值,并将各个枚举值序列和枚举值名与枚举值之间做映射(保存在Map中),如上述枚举类型,将会生成以下Map:

0 => ScoreType.TOTAL_SCORETOTAL_SCORE => ScoreType.TOTAL_SCORE1 => ScoreType.MIDDLE_SCOREMIDDLE_SCORE => ScoreType.MIDDLE_SCORE2 => ScoreType.FINAL_SCOREFINAL_SCORE => ScoreType.FINAL_SCORE

通过此Converter,就可以实现前台传序号和枚举名,都能成功映射到枚举类型,将此Converter通过工厂模式提供到springboot中:

public class BaseEnumConverterFactory implements ConverterFactory {    private static final Map CONVERTERS = new HashMap<>();    @Override    public  Converter getConverter(Class targetType) {        // 每一个类型创建一个转换器        Converter converter = CONVERTERS.get(targetType);        if (converter == null) {            converter = new BaseEnumConverter<>(targetType);            CONVERTERS.put(targetType, converter);        }        return converter;    }}@Configuration@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer {    @Override    public void addFormatters(FormatterRegistry registry) {        registry.addConverterFactory(new BaseEnumConverterFactory());    }}

进行测试,使用枚举名发送数据:

灵活化

为了保证灵活性,每个枚举类型可以自定义转换的方式,建立一个接口,对接口进行类型转换,建立一个BaseEnum接口:

public interface BaseEnum {    String[] getKeys(); //返回的keys可转换为BaseEnum}

枚举类实现此接口,并定义映射方式

public enum ScoreType implements BaseEnum {    TOTAL_SCORE("总评成绩"),    MIDDLE_SCORE("期中成绩"),    FINAL_SCORE("期末成绩");    String des; // 描述    ScoreType(String des) {        this.des = des;    }    public String getDes() {        return des;    }    @Override    public String[] getKeys() {        String[] s = {String.valueOf(this.ordinal()), this.name()}; // 次序和名字都可转为枚举,如0和total_score => ScoreType.TOTAL_SCORE    return s;    }}

转换器统一对BaseEnum进行转换:

public class BaseEnumConverter implements Converter {    private Map enumMap = new HashMap<>();    public BaseEnumConverter(Class enumType) {        T[] enums = enumType.getEnumConstants();        // 根据keys建立转换        for (T e : enums) {            for (String key : e.getKeys()) {                enumMap.put(key, e);            }        }    }    @Override    public T convert(String source) {        T t1 = enumMap.get(source.toLowerCase());        T t2 = enumMap.get(source.toUpperCase());        if (t1 == null && t2 == null) {            throw new IllegalArgumentException("无法匹配对应的枚举类型");        }        return t1 == null ? t2 : t1;    }}

对于每个枚举类型,可通过返回的keys来自定义转换的方式。

感谢各位的阅读,以上就是"springboot怎么实现枚举类型传递"的内容了,经过本文的学习后,相信大家对springboot怎么实现枚举类型传递这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

类型 成绩 参数 序号 接口 数据 方式 学习 测试 之间 内容 就是 总评 转换器 成功 代码 前台 可以通过 可转换 名字 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 湖南永感互联网科技有限公司 互联网最新的科技 科技互联网公司装修 唐信互联网科技 苏州互联网科技贷款公司 衡水科技产业互联网平台 卫星互联网科技股票 互联网科技与管理 和信科技工业互联网 晓花互联网科技有限公司网址 互联网科技商业 消费医药和互联网科技 互联网在线教育科技创业 互联网科技创新的路径 华中科技大学互联网的牛人 上海创道互联网络科技有限公司 工业互联网科技成果转化 世界互联网科技成果奖 科技信息时代互联网发展 互联网与科技发展 恒银科技与互联网金融 互联网媒体平台算高科技产业 国大互联网教育科技有限公司工作 天津腾达互联网科技有限公司 西安小鹰速贷互联网科技有限公司 特约风豹互联网科技为什么扣费 湖北辰鑫科技互联网 上海旺乐尼互联网科技有限公司 前海云享互联网科技
0