在开发中,经常会用到枚举等来增强代码可读性,但是枚举类型在与前端交互的时候需要转换器来实现类型转换。通常,
可以自定义一个转换器
DemoConverter implements org.springframework.core.convert.converter.Converter
public DemoEnum convert(String source){
if(source!=null){
for(DemoEnum e:DemoEnum.values()){
if(e.getValue().equals(source)){
return e;}}}}
return null;}
但是此种方法,每一个枚举类型,就要写一个转换器,非常麻烦。为此,可以实现ConverterFactory接口,来自制一个转换器工厂,实现通用转换的需求。
方法:
1.定义一个BaseEnum{Object getValue()},以后所有枚举类型都继承该基类枚举
2.定义一个GlobalConverterFactory :
public class GlobalrFactory implements ConverterFactory
private static finalMapconverterMap=newHashMap<>();
@Override
public ConvertergetConverter(Class targetType) {
Converter result =converterMap.get(targetType);
if(result ==null) {
result =new StringToEnum(targetType);
converterMap.put(targetType,result);
}
returnresult;}
class StringToEnumimplements Converter {
private finalClassenumType;
private MapenumMap=newHashMap<>();
public StringToEnum(Class enumType) {
this.enumType= enumType;
T[] enums = enumType.getEnumConstants();
for(Te : enums) {
enumMap.put(e.getValue() +"",e);
}}
@Override
publicTconvert(String source) {
Tresult =enumMap.get(source);
if(result ==null) {
throw newIllegalArgumentException("没有匹配到枚举值: "+ source);
}
returnresult;}}}
3:将我们自定义的工厂集成到springboot中,定义一个DemoConfiguration extends WebMvcConfigurerAdapter
覆盖 addFormatters 方法
@Override
public voidaddFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new GlobalrFactory());
}
参考:http://elim.iteye.com/blog/1860732#_Toc355638187
http://blog.csdn.net/u014527058/article/details/62883573