首页 > 解决方案 > ModelMapper LinkedHashMap 到 LinkedHashMap ArrayIndexOutOfBoundsException

问题描述

我一直在从事一个项目,其中一些新的状态数据被提取到一个对象中,并通过 ModelMapper 应用于当前对象状态数据。字段会自动匹配和更新,这很好。

现在我以 List<Map<String, String>> 的形式添加了一些更复杂的数据。
事情正在破裂。

这是简化的代码:

public class TypeA {     
       private List<Map<String, String>> listOfMap;
      
}

public class TypeB {     
       private List<Map<String, String>> listOfMap;
      
}
 
public class Test {
       public static void main(String[] args) {           
        TypeA typeA = new TypeA();      
        TypeB typeB = new TypeB();
        
        Map<String, String>  m1 = new LinkedHashMap();
        m1.put("test1","machin");
        m1.put("test2","truc");
        m1.put("test3","bidule");
        
        Map<String, String>  m2 = new LinkedHashMap();
        m2.put("test1","machin");
        m2.put("test2","truc");
        
        List<Map<String, String>> l1 = new ArrayList<Map<String, String>>();        
        l1.add(m1);
        
        List<Map<String, String>> l2 = new ArrayList<Map<String, String>>();        
        l2.add(m2);
        
        typeA.setListOfMap(l1);     
        typeB.setListOfMap(l2);   // this can be set to null to fix the problem  
        
        ModelMapper modelmapper = new ModelMapper();
            
             try {
                    modelmapper.map(typeA, typeB); 
             } catch (Exception e) {
                    e.printStackTrace();
             }
       }
}

如果 typeB listOfMap 为空,则一切正常。
但是,如果我们已经在对象类型 B 的 listOfMap 中有另一个值列表。
然后我们在尝试将 A 映射到 B 时收到以下错误:

 
1) Converter org.modelmapper.internal.converter.MapConverter@1f32e575 failed to convert java.util.LinkedHashMap to java.util.LinkedHashMap.
 
1 error
       at org.modelmapper.internal.Errors.throwMappingExceptionIfErrorsExist(Errors.java:380)
       at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:81)
       at org.modelmapper.ModelMapper.mapInternal(ModelMapper.java:573)
       at org.modelmapper.ModelMapper.map(ModelMapper.java:447)
       at modelmapper_debug.Main.main(Main.java:30)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
       at org.modelmapper.internal.converter.MapConverter.convert(MapConverter.java:59)
       at org.modelmapper.internal.converter.MapConverter.convert(MapConverter.java:1)
       at org.modelmapper.internal.MappingEngineImpl.convert(MappingEngineImpl.java:303)
       at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:110)
       at org.modelmapper.internal.converter.MergingCollectionConverter.convert(MergingCollectionConverter.java:59)
       at org.modelmapper.internal.converter.MergingCollectionConverter.convert(MergingCollectionConverter.java:1)
       at org.modelmapper.internal.MappingEngineImpl.convert(MappingEngineImpl.java:303)
       at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:110)
       at org.modelmapper.internal.MappingEngineImpl.setDestinationValue(MappingEngineImpl.java:242)
       at org.modelmapper.internal.MappingEngineImpl.propertyMap(MappingEngineImpl.java:188)
       at org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:152)
       at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:115)
       at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:72)
       ... 3 more

这里发生了什么?
我可以修复此代码以使 ModelMapper 映射 List<Map<String, String>> 类型正确吗?

谢谢大家

标签: javaexceptionindexoutofboundsexceptionlinkedhashmapmodelmapper

解决方案


  1. 我不知道你为什么使用 modelmapper.map(typeA, typeB) 而不是 modelmapper.map(typeA, TypeB.class) http://modelmapper.org/getting-started/
  2. 您可以将自己的映射用于复杂数据:
公共类 TestModelMapper 扩展 ModelMapper {

    测试模型映射器() {
        极好的();
        this.initMappings();
    }

    私人无效initMappings(){
        转换器>,列表>>转换器=新转换器(){
            公共列表>转换(映射上下文>,列表>>上下文){
                返回 context.getSource() == null ?空:新的 ArrayList(context.getSource());
            }
        };
        PropertyMap entityToDTOMap = new PropertyMap() {
            受保护的无效配置(){
                using(converter).map(source.getListOfMap()).setListOfMap(null);
            }
        };

        this.addMappings(entityToDTOMap);
    }
}

公共类测试{
    
    公共静态无效主要(字符串[]参数){           
        TypeA typeA = new TypeA();      
        TypeB typeB = new TypeB();
        
        映射 m1 = new LinkedHashMap();
        m1.put("test1","机器");
        m1.put("test2","truc");
        m1.put("test3","bidule");
        
        列表> l1 = 新的 ArrayList>();        
        l1.add(m1);
        
        typeA.setListOfMap(l1);     
        
        ModelMapper modelmapper = new TestModelMapper();
            
        尝试 {
            modelmapper.map(typeA, TypeB.class);
        } 捕捉(异常 e){
            e.printStackTrace();
        }
    }
}

推荐阅读