mybatis的枚举类处理器不生效问题解决

进入convenient项目后遇到了枚举类处理器不能正确被处理的问题,经过查找,找到了相关的代码

mybatis的枚举类处理器不生效问题解决_第1张图片

 

可以看见通过配置mybatis的数据库会话工厂类,我们能够对枚举处理器进行配置。

 

但是为什么这个处理器没有生效呢?

 

经过我两天对着源码一行一行的排查,发现这样一个问题:

mybatis的枚举类处理器不生效问题解决_第2张图片

这个getObject()方法是一个单例方法,在return行的再次调用并没有让它再次执行配置方法。

而另一边,mybatis的类型转换注册器就像它的名字一样,执行的是一个注册策略,拿到一个类型的字段后,mybatis会根据这个字段的类型去注册表中找到相应的处理器,而注册的方法名就是register(......)。

 

 

在这个机制的基础上,我们发现sqlSessionFactory被build的过程中,默认类型转换处理器已经被注册完毕了(具体是在MybatisSqlSessionFactoryBean的615行的xmlMapperBuilder的parse方法中)

mybatis的枚举类处理器不生效问题解决_第3张图片

所以,图中的setDefaultEnumTypeHandler()方法只是替换了一个已经被用完了的默认类型处理器而已,并没有被注册,自然也派不上用场了。

 

 

知道了错误原因,那修正就很简单了,只需要将配置提前到单例类生成就行了。

在这次修正中有两点值得注意:

一点就是除了默认的类型处理器外,另外的两个处理器都是有效的,因为它们都是使用了注册方法注册进了注册表里面;

第二点就是为什么老一套(就是sqlProvider那一套)能够正常解析枚举类呢?

我也思考了很久,以为是走了什么特殊的方法,但始终没有找到,当我尝试着把配置文件回滚了,然后老一套也开始报错了,因为无法复现所以目前也没有什么头绪。

 

以下内容为个人的一点猜测:

register方法不仅仅在被初始化的时候用到了,所以呢,也没准mybatis遇到了一个没处理过的新类型的时候,会拿默认的类型处理器现注册一个,这个过程在初始化之后,所以能够用上我们自定义的处理器……现在也没法考证了……

 

 

 

你可能感兴趣的:(项目经验)