Springboot通用转换器实现策略

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

可以自定义一个转换器

DemoConverter implements org.springframework.core.convert.converter.Converter<String,DemoEnum> {

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<String,BaseEnum> {

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,408评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,932评论 18 399
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,350评论 0 33
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 4,549评论 0 1
  • 什么是成功的人生?突然看到这个题目的时候感觉挺大,现在快速的生活中已经忘却了因为什么而去忙碌奔波。不知何时起我的朋...
    朝壹阅读 2,047评论 0 2