springboot枚举类型传递的步骤

网友投稿 716 2023-01-29

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();

}

}

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

使用枚举序号发送数据:

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

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_SCORE

TOTAL_SCORE => ScoreType.TOTAL_SCORE

1 => ScoreType.MIDDLE_SCORE

MIDDLE_SCORE => ScoreType.MIDDLE_SCORE

2 => ScoreType.FINAL_SCORE

FINAL_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

@EnableWebMvc

public class WebConfig implements WebMvcConfigurer {

@Override

public void addFormatters(FormatterRegistry registry) {

registry.addConverterFactory(new BaseEnumConverterFactory());

}

}

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

灵活化

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

public interface BaseEnum {

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

}

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

public enum ScoreToYBdKype 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枚举类型传递的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:unisdk(unisdk_push是什么文件夹可以删除吗)
下一篇:IDEA 错误 No main class specified的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~