告别手动set时间MyBatis-Plus的MetaObjectHandler配置90%的人可能都漏了这一步在Spring Boot项目中MyBatis-Plus的自动填充功能是提升开发效率的利器但很多开发者在配置MetaObjectHandler时往往会遇到自动填充不生效的问题。本文将带你深入排查这一常见问题并提供一个完整的解决方案。1. 自动填充功能的基本配置首先我们需要了解MyBatis-Plus自动填充的基本配置流程。以下是一个典型的配置步骤添加依赖确保项目中引入了MyBatis-Plus的starter依赖。实体类注解在需要自动填充的字段上添加TableField注解。实现MetaObjectHandler创建一个类实现MetaObjectHandler接口并添加Component注解。Data public class User { TableId(type IdType.AUTO) private Long id; private String name; TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }2. 常见问题排查当自动填充不生效时可以按照以下步骤进行排查2.1 基础检查确认Component注解是否被正确扫描检查字段类型是否匹配如LocalDateTime与Date验证TableField注解的fill属性是否正确2.2 进阶排查如果基础检查都通过但自动填充仍然不生效可能是以下原因多数据源配置冲突当项目中使用多数据源时自定义的SqlSessionFactory可能会覆盖默认配置。特定版本问题某些MyBatis-Plus版本可能存在已知的自动填充问题。全局配置缺失在特定项目结构中需要显式配置GlobalConfig。3. 完整解决方案对于大多数项目特别是使用了多数据源或特定starter的项目需要以下完整配置Configuration public class MybatisPlusConfig { Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig new GlobalConfig(); globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); return globalConfig; } Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 添加分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }对于更复杂的多数据源场景需要为每个数据源单独配置Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); GlobalConfig globalConfig new GlobalConfig(); globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); factoryBean.setGlobalConfig(globalConfig); return factoryBean.getObject(); }4. 最佳实践与性能优化为了确保自动填充功能的高效运行建议遵循以下最佳实践使用strict模式在MetaObjectHandler实现中使用strictInsertFill和strictUpdateFill方法可以避免字段类型不匹配的问题。避免频繁创建对象对于常用的填充值如当前时间可以缓存而不是每次都创建新对象。日志记录在MetaObjectHandler中添加适当的日志方便调试和问题排查。Component Slf4j public class OptimizedMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { log.debug(开始执行插入自动填充); LocalDateTime now LocalDateTime.now(); this.strictInsertFill(metaObject, createTime, LocalDateTime.class, now); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, now); } Override public void updateFill(MetaObject metaObject) { log.debug(开始执行更新自动填充); this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }在实际项目中我曾遇到一个典型问题在多模块项目中由于包扫描范围设置不当导致MetaObjectHandler未被正确加载。通过显式配置GlobalConfig并检查包扫描范围最终解决了这个问题。