Springboot通用转换器实现策略

在开发中,经常会用到枚举等来增强代码可读性,但是枚举类型在与前端交互的时候需要转换器来实现类型转换。通常,

可以自定义一个转换器

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

你可能感兴趣的:(Springboot通用转换器实现策略)