升级orika-mapper至1.5.4后映射带上下文的对象列表触发空指针异常
解决Orika 1.5.4升级后mapAsList带MappingContext的NullPointerException问题
从你提供的异常栈和代码来看,这个空指针问题是Orika 1.5.x版本对双向映射处理逻辑的变化导致的——在1.4.6中,框架不会强制检查反向映射的实现,但升级到1.5.4后,当你使用带MappingContext的mapAsList方法时,Orika会尝试生成B到A的反向映射器,而你的自定义CustomMapper只实现了mapAtoB方法,没有处理反向映射,最终触发了空指针。
这里有几个针对性的解决方案,你可以根据自己的业务需求选择:
方案1:禁用反向映射(推荐,如果你不需要B到A的映射)
修改你的configure方法中类映射的注册代码,明确告诉Orika不需要生成B到A的反向映射:
@Override public void configure(MapperFactory mapperFactory) { mapperFactory.registerClassMap( mapperFactory.classMap(A.class, B.class) .byDefault() .customize(getAtoBMapper()) .excludeReverse() // 关键:禁用反向映射生成 .toClassMap() ); }
方案2:补全反向映射方法(如果需要双向映射)
如果你的业务场景中确实需要B到A的映射,或者Orika仍然会触发反向映射逻辑,那就在自定义的CustomMapper中补全mapBtoA方法,哪怕是空实现:
private CustomMapper<A,B> getAtoBMapper() { return new CustomMapper<A,B>() { @Override public void mapAtoB(A a, B b, MappingContext context) { // 保留你原有的A到B自定义映射逻辑 } @Override public void mapBtoA(B b, A a, MappingContext context) { // 实现B到A的映射逻辑,或者留空(如果不需要实际映射的话) } }; }
方案3:检查MappingContext的初始化
确保你传入MappingContext的map不是null,空初始化可能也会引发潜在的空指针:
// 确保map已初始化,不要传入null Map<String, Object> mappingData = new HashMap<>(); MappingContext mappingContext = new MappingContext(mappingData); List<B> bList = customMapper.mapAsList(aList, B.class, mappingContext);
简单来说,1.5.4版本的Orika在处理带上下文的映射时,对双向映射的校验更严格了,只要补上反向映射的实现或者明确禁用反向生成,就能解决这个问题。
内容的提问来源于stack exchange,提问作者Govind
相关产品推荐
相关产品推荐

