MyBatisPlus异常之自动填充失效

使用MP的自动填充出现问题

博主最近刚刚学习了MP,在使用了代码生成器后,在增加数据操作的时候,想试用自动填充,没报异常,但是没用出现自动注入

博主使用mybatis版本是 MyBatis3.1.0,自动填充按照官方文档提示使用,

  • 在实体类上使用@TableField,并用fill属性指定自动填充策略
  • 自定义实现类MetaObjectHandler中的insertFill(MetaObject )和updateFill(MetaObject )方法,

特别注意,自定义类的时候要将该类注入spirng容易中,使用@Component注解,或者在mybtisplus的注解类上使用@Bean注入,推荐使用第一种,比较简单。

博主在这种情况下还出现了mybatis自动注入失效,
通过debug追踪发现内容出了异常,mybatisplus内部自己处理了该异常,所以没有察觉到出现出现异常-------博主这里出现的是类型转化异常
MP代码生成器使用的是LocalDateTime,而自己自动注入的时候,使用的是
java.sql.Timestamp
代码实例
将实体类中的类型修改为java.sql.Timestamp即解决了该问题。

希望该方案了帮助到你解决问题,如果你出现了该类型的其他问题,建议通过debug方式来调试,而不是通过日志来调试,如果你不会debug,花点时间就很容易学会了,多调试几次就习惯了。

### MyBatisPlus 自动填充失效的原因分析 当遇到MyBatisPlus自动填充功能失效的情况时,可能由多种因素引起。具体来说: - 如果实体类中的字段被标记了`@TableField(fill = FieldFill.INSERT)`但仍返回`null`,这可能是由于未正确注册元对象处理器所致[^2]。 - 对于多数据源环境下的应用,每个数据源应拥有独立的`SqlSessionFactory`和`SqlSessionTemplate`实例;如果这些组件未能适当地关联到各自的自动填充处理器,则可能导致该特性无法正常工作[^3]。 ### 解决方案概述 为了修复上述提到的问题并使自动填充机制恢复正常运作,可以采取如下措施之一或组合使用: #### 方法一:确认已实现MetaObjectHandler接口 确保项目中有实现了`com.baomidou.mybatisplus.core.handlers.MetaObjectHandler`接口的服务,并重写了其中的方法来定义具体的填充逻辑。例如,在此类中指定如何处理插入操作(`insertFill`)以及更新操作(`updateFill`)期间的数据赋值行为[^4]。 ```java @Component public class CustomMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, "createBy", String.class, "system"); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now()); this.strictUpdateFill(metaObject, "modifyBy", String.class, "system"); } } ``` #### 方法二:自定义全局配置文件 通过调整Spring Boot应用程序内的`application.yml`或其他形式的应用程序属性设置,确保所有必要的参数都得到了恰当设定。特别是对于那些涉及多个数据库连接池的情形下,需特别注意针对每一个单独的数据源都要有相应的配置项用于激活其对应的自动填充支持。 ```yaml spring: datasource: master: url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3307/slave_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true global-config: db-config: id-type: auto field-strategy: not_empty mapper-locations: classpath*:mapper/*.xml # 配置多数据源情况下各数据源特有的自动填充处理器 multi-datasource: primary: master slaves: - name: slave handler-package: com.example.demo.handler.slave ``` #### 方法三:检查依赖版本兼容性 有时不同库之间的版本差异也可能引发意想不到的行为变化。因此建议核查当前使用的MyBatis Plus及其相关扩展包的具体版本号,必要时升级至最新稳定版以获得更好的性能表现及错误修正[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值