好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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 < T extends Enum > implements Converter < String , T > { private Map < String , T > enumMap = new HashMap <>(); public BaseEnumConverter ( Class < T > 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 < String , Enum > { private static final Map < Class , Converter > CONVERTERS = new HashMap <>(); @Override public < T extends Enum > Converter < String , T > getConverter ( Class < T > targetType ) { // 每一个类型创建一个转换器 Converter < String , T > 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 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 < T extends BaseEnum > implements Converter < String , T > { private Map < String , T > enumMap = new HashMap <>(); public BaseEnumConverter ( Class < T > 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枚举类型传递的资料请关注其它相关文章!

原文链接:https://segmentfault测试数据/a/1190000039803020

查看更多关于springboot枚举类型传递的步骤的详细内容...

  阅读:10次