springboot怎么实现枚举类型传递
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要讲解了"springboot怎么实现枚举类型传递",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"springboot怎么实现枚举类型传递"吧
千家信息网最后更新 2025年02月02日springboot怎么实现枚举类型传递测试
Converter
灵活化
这篇文章主要讲解了"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安全错误
数据库的锁怎样保障安全
行政审批局网络技术服务中心
检查网络安全的苹果手机软件
开网吧需要买服务器吗
深圳微客云网络技术有限公司
科技节关于互联网的发言稿
电信公司网络安全运维工程师工资
移动软件开发课程设计计算器
服务器安全链连失败
程序可以和pc网站共用数据库
软件开发的项目实训收费吗
企业搭建公网服务器流程
软件开发方向论文怎么写
你的邮件证书服务器无效
软件开发 知识要求
cf服务器连接失败为什么
海豚数据库 来源数据库
java后端是软件开发吗
spring数据库密码加密
污染源企业端数据库
代理服务器设置线路
陕西网络安全公司排名
软件开发公司简介模板范文
我要去查数据库
河南语音网络技术优势
南京旭斌网络技术
威高软件开发面试
java游戏服务器开发大厂
lucene 数据库索引
现场软件开发工程师
互联网科技企业绩效考核