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
相关产品推荐
相关产品推荐

