首页 > 其他分享 >MetaObjectHandler自动填充不生效

MetaObjectHandler自动填充不生效

时间:2024-03-15 14:22:23浏览次数:19  
标签:填充 MetaObjectHandler factory 生效 globalConfig TODO 注入

背景:

导入时涉及到保存数据到数据库,插入失败,错误如下

解决方案:

插入的实体类基本都继承了一个BaseEntity,会涉及到tmSmp和tmCreate这两个自动填充字段,tmSmp是FieldFill.INSERT类型,tmCreate是FieldFill.INSERT_UPDATE

自动填充一般流程:自行实现MetaObjectHandler并注入到IOC容器中即可

分析源码MybatisPlusAutoConfiguration#sqlSessionFactory可知

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    // TODO 使用 MybatisSqlSessionFactoryBean 而不是 SqlSessionFactoryBean
    MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    ......
    // TODO 此处必为非 NULL
    GlobalConfig globalConfig = this.properties.getGlobalConfig();
    // TODO 注入填充器
    this.getBeanThen(MetaObjectHandler.class, globalConfig::setMetaObjectHandler);
    // TODO 注入主键生成器
    this.getBeanThen(IKeyGenerator.class, i -> globalConfig.getDbConfig().setKeyGenerator(i));
    // TODO 注入sql注入器
    this.getBeanThen(ISqlInjector.class, globalConfig::setSqlInjector);
    // TODO 注入ID生成器
    this.getBeanThen(IdentifierGenerator.class, globalConfig::setIdentifierGenerator);
    // TODO 设置 GlobalConfig 到 MybatisSqlSessionFactoryBean
    factory.setGlobalConfig(globalConfig);
    return factory.getObject();
}

 

IOC容器在没有SqlSessionFactory这个bean对象时会去调用这个方法创建一个,并且注入填充器

但是由于本次的项目是多数据源,需要自行写SqlSessionFactory的返回,所以我们需要自行去注入填充器

 

// 设置自动填充
GlobalConfig globalConfig = this.mybatisPlusProperties.getGlobalConfig();
if (globalConfig == null) {
    globalConfig = GlobalConfigUtils.defaults();
}
globalConfig.setMetaObjectHandler(metaObjectHandler);
factory.setGlobalConfig(globalConfig);

一般流程到这里就OK了,但是每次我debug的时候都取不到MetaObjectHandler,MybatisParameterHandler#insertFill中的GlobalConfigUtils.getMetaObjectHandler(this.configuration)始终为空

最后将我的Mybatis配置类实现了SmartInitializingSingleton,在所有单例实例化结束后去重新设置一下填充器

@Override
public void afterSingletonsInstantiated() {
GlobalConfig globalConfig1 = GlobalConfigUtils.getGlobalConfig(originConfiguration2);
if (globalConfig1 != null) {
globalConfig1.setMetaObjectHandler(metaObjectHandler);
}
}

完美解决问题,最终找到罪魁祸首

在我定义SqlSessionFactory时有一段代码如下

MybatisConfiguration originConfiguration = this.mybatisPlusProperties.getConfiguration();
        MybatisConfiguration configuration = new MybatisConfiguration();
        if (originConfiguration != null) {
            BeanUtils.copyProperties(originConfiguration, configuration);
        }

这个工具类copy的时候会调用到两个弃用的方法,会调用MybatisConfiguration两个弃用的方法getGlobalConfig和setGlobalConfig

因此需要将copy的代码改成

BeanUtils.copyProperties(originConfiguration, configuration, "globalConfig");

即可

最后望大家写代码细心,少出bug(#^.^#)

标签:填充,MetaObjectHandler,factory,生效,globalConfig,TODO,注入
From: https://www.cnblogs.com/lhbilibili/p/18075301

相关文章

  • sql server 左链接为准 ,匹配不到,空填充
    SELECT*,PR.OrderNoFROMTB_USERuOUTERAPPLY(  SELECTTOP    1R.id,    R.OrderNo  FROM    tb_order(NOLOCK)R   WHERE    R.ID=u.ORDERIDORDERBYOutTimedesc  )ASPR  WHEREu.IsDel=0  SELECTu.L......
  • 视频监控/云存储EasyCVR视频融合平台设备增删改操作不生效是什么原因?
    国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,平台支持7*24小时实时高清视频监控,能同时播放多路监控视频流,视频画面1、4、9、16个可选,支持自定义......
  • vue2项目中不能直接在store中声明响应式变量,vue3项目中能在store中直接声明响应式变量
    vue2项目中不能直接在store中声明响应式变量,vue3项目中能在store中直接声明响应式变量,页面元素也会响应式生效在Vue2项目中,store中的状态默认情况下是不具备响应式的特性的。这是因为Vue2.x使用的是基于对象定义的Vue.observable()来创建响应式对象,而store中的状态是通......
  • 不同版本jdk切换,为什么更改了系统变量也并未生效?(含解决方法)
    背景:在已经安装了jdk8的情况下,由于需要,再次又安装了jdk11,但之后想切换回jdk8时,发现即使更改了系统变量也没有生效。原因:安装jdk可以通过exe或者解压压缩包指定环境变量,详细步骤不细说。打开高级系统设置-环境变量-系统变量-path-编辑。注意:如果path对应“值”这一栏并不是以......
  • excel 自动新增以及填充数据
    拿下图举例: 客户编码需要自增一直到结尾1、选中第一行ctrl+shift+箭头下2、选择开始==》填充==》序列==》等差序列 设置步长即可 ......
  • 解决datepicker设置限定日期范围后 选中节点日期不生效
    问题描述:项目要求设定日期限定范围,如2023-04-01至2024-03-01,其它不可选 但每当我选择的月份包含4月或次年3月时,即使选中日期,弹窗也不消失经过我机智过人的大脑”短暂“思考后,发现当我设定限定范围时,是这样设置的returntime.getTime()<newDate("2023-04-01").getTime()......
  • 解决element-ui的date-picker组件的picker-options属性不生效的问题
    网上查半天都没查到,好像没人写,于是俺怀着激动的心情来记录下项目来需求,说要控制日期选择的最大最小范围,看似简单,实则藏深坑!小白的我天真地按照网上的例子(主要是官网也不给一个!)写完如下:1.属性绑定 2.数据绑定(这步错了别抄) 错就错在第二步,它不应该绑定在data里吖,后经高人......
  • 解决表格修改格式后需要双击才能生效
    下载或复制值的Excel、WPS表格常会遇到,修改格式后不生效需要双击才会变化的情况。解决方法数据->分列->tab键->下一步->完成......
  • 有一个子组件DataList,然后在父组件中引入,并在父组件引入中的DataList标签上设置style
    有一个子组件DataList,然后在父组件中引入,并在父组件引入中的DataList标签上设置style样式,能生效吗?在React中,父组件可以通过props将样式传递给子组件,并在子组件内部应用这些样式。但直接在父组件引用子组件的地方设置style属性通常不会生效,因为React的JSX语法并不支持这种写法。......
  • pycharm环境下添加.gitignore后发现未生效问题处理
    pycharm环境下添加.gitignore后,提交代码到gitlab发现项目文件都提交了,特别是venv环境也在里面,分析原因可能是.gitignore是在创建git后添加的,所以没有生效,处理办法如下:首先清理缓存,然后重新添加提交gitrm--cached.#也可以指定文件清理缓存gitadd.gitcommit-m'更新过......