You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mybatis MetaObject.setValue操作空List无法自动创建的问题

解决Mybatis MetaObject修改null List时自动创建集合的问题

当使用MetaObject.setValue("list[0]", 1)修改null状态的List属性时,默认会抛出ReflectionException,因为Mybatis的默认ObjectFactory不会自动初始化接口类型的集合。要实现自动创建List,可通过自定义ObjectFactory来处理:

1. 自定义ObjectFactory,自动实例化集合接口

重写DefaultObjectFactory的create方法,针对集合接口返回具体实现类:

public class AutoCollectionObjectFactory extends DefaultObjectFactory {
    @Override
    public <T> T create(Class<T> type) {
        // 处理List接口,返回ArrayList实例
        if (List.class.isAssignableFrom(type)) {
            return (T) new ArrayList<>();
        }
        // 可扩展处理其他集合类型
        if (Set.class.isAssignableFrom(type)) {
            return (T) new HashSet<>();
        }
        if (Map.class.isAssignableFrom(type)) {
            return (T) new HashMap<>();
        }
        // 其他类型沿用默认逻辑
        return super.create(type);
    }
}

2. 使用自定义ObjectFactory创建MetaObject

在创建MetaObject时传入自定义的工厂类,替换默认实现:

@Test
public void test1() {
    Demo demo = new Demo();
    // 用自定义工厂创建MetaObject
    MetaObject metaObject = MetaObject.forObject(
        demo, 
        new AutoCollectionObjectFactory(), 
        new DefaultObjectWrapperFactory(), 
        new DefaultReflectorFactory()
    );
    metaObject.setValue("list[0]", 10);
    Assertions.assertEquals(10, demo.getList().get(0));
}

public static class Demo {
    private List<Integer> list;

    public List<Integer> getList() {
        return list;
    }

    public void setList(List<Integer> list) {
        this.list = list;
    }
}

原理说明

Mybatis的MetaObject在处理集合索引赋值时,若发现目标集合为null,会调用ObjectFactory的create方法尝试创建实例。默认DefaultObjectFactory无法实例化接口类型(如List),自定义工厂通过判断类型返回具体实现类,从而实现null集合的自动初始化。

内容的提问来源于stack exchange,提问作者yu zou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:02:36