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

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

 

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

 

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

 

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

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

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

 

 

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

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

 

 

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

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

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

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

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

 

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

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

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值