Mybatis-Plus 3.2.0 版本 MetaObjectHandler 无法进行公共字段全局填充

本文详细解析了在一个数据中台项目中,如何在复杂的部署环境下,通过XML配置文件启用MybatisPlus的MetaObjectHandler,解决由SpringBoot配置方式转换带来的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 问题描述

最近在做的这个项目架构组对于配置文件决定,采取的是 .xml 配置文件

一个数据中台项目,因为部署环境比较复杂,可能需要适配阿里、腾讯、开源等环境和机房,所以配置文件和启动类为三类


之前写的 MetaObjectHandler 都是采用的 SpringBoot 配置方式开发,突然换成 .xml 配置文件,还是有不少坑的,其中就有配置的 MetaObjectHandler 怎么都不起作用 ⬆️🔥(上火)


2 问题代码

这种方式放在 平常 SpringBoot 项目中,一点毛病没有…

@Component
public class MybatisPlusObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        Date now = new Date();

        Object crteTime = getFieldValByName("crteTime", metaObject);
        if (Objects.isNull(crteTime)) {
            setFieldValByName("crteTime", now, metaObject);
        }

        Object optTime = getFieldValByName("optTime", metaObject);
        if (Objects.isNull(optTime)) {
            setFieldValByName("optTime", now, metaObject);
        }

        setFieldValByName("invdFlag", TpcConstant.INVD, metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        Object optTime = getFieldValByName("optTime", metaObject);
        if (Objects.isNull(optTime)) {
            setFieldValByName("optTime", new Date(), metaObject);
        }
    }
}

3 解决方式

MybatisPlusObjectHandler 类上的 @Component 去掉,换成在 .xml 中注册

<bean class="xxx.xxx.xxx.MybatisPlusObjectHandler" id="myMetaObjectHandler"/>

    <bean id="globalConfiguration" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
        <property name="metaObjectHandler" ref="myMetaObjectHandler"/>
    </bean>

    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <!-- 注入公共字段填充处理器 -->
        <property name="globalConfig" ref="globalConfiguration" />
    </bean>

问题解决 还是比较疑问 🤔️ 既然采用了 SpringBoot 开发框架,为什么还是要使用 .xml 配置文件的这种方式?

我的猜测是: 因为我们是三套环境部署, 这么做是为了将配置统一管理

如果在座大佬有更好的见解, 欢迎评论区留言或私信 👏


微信搜索【源码兴趣圈】,关注龙台,回复【资料】领取涵盖 GO、Netty、SpringCLoud Alibaba、Seata、开发规范、面试宝典、数据结构等电子书 or 视频学习资料!

### MyBatis Plus 填充无效解决方案 #### 1. 检查依赖版本兼容性 确保使用的 `mybatis-plus` 版本与其他项目依赖项相匹配。不同版本之间可能存在API变更或Bug修复,这可能影响到自动填充功能的效果[^1]。 ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> ``` #### 2. 配置全局配置文件 确认已在项目的全局配置文件(如application.yml 或 application.properties)中正确设置了MyBatis-Plus的相关参数,特别是关于Mapper接口扫描路径以及元对象处理器的设置[^4]。 对于YAML格式的应用程序配置: ```yaml mybatis-plus: global-config: db-config: id-type: auto meta-object-handler: com.example.demo.handler.MyMetaObjectHandler ``` #### 3. 自定义 Meta Object Handler 类 创建自定义的 `MetaObjectHandler` 来处理字段的默认值赋值逻辑,并重写相应的方法来指定哪些字段应该被自动填充及其规则。 ```java @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()); } } ``` #### 4. 实体类上添加注解 在实体类中的对应属性上方加上适当的时间戳或其他类型的注解,以便让框架知道这些字段需要参与自动填充操作。 ```java @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; ``` #### 5. AOP切面增强 如果仍然遇到问题,则可以考虑通过AOP方式拦截更新方法,在执行前手动调用填充值的操作[^3]。 ```java @Aspect @Component @Slf4j public class AutoFillInterceptor { @Autowired private MetaObjectHandler handler; @Pointcut("execution(* com.baomidou.mybatisplus.extension.service.IService.update(..))") public void pointCut() {} @Around("pointCut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { try { // 获取目标对象并尝试触发fill机制 Object[] args = pjp.getArgs(); if (args != null && args.length > 0){ for(Object arg : args){ if(arg instanceof Wrapper){ continue; } MetaObject mo = SystemMetaObject.forObject(arg); handler.insertFill(mo); // 插入时填充 handler.updateFill(mo); // 更新时填充 } } return pjp.proceed(args); } catch (Throwable e) { log.error(e.getMessage(),e); throw new RuntimeException(e); } } } ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值