java - 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>> 类型正确吗?
谢谢大家
解决方案
- 我不知道你为什么使用 modelmapper.map(typeA, typeB) 而不是 modelmapper.map(typeA, TypeB.class) http://modelmapper.org/getting-started/
- 您可以将自己的映射用于复杂数据:
公共类 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(); } } }
推荐阅读
- javascript - Apex Charts 侧边栏高度
- azure-ad-b2c - 在 Azure B2C 中重置密码用户流不返回 AADB2C90118
- r - ggplot w/x轴月-年(无天)和“过滤器”开始日期
- yii2 - 通过ajax的表单未提交
- laravel - How to get the project which belongs specific user
- flutter - 在内置打印机的设备中单击按钮时是否有任何选项可以打印收据
- nosql - Oracle NoSQL 数据库中是否提供 SQL IN 运算符?
- reactjs - Django jwt 令牌错误。“给定的令牌对任何令牌类型均无效,token_not_valid”
- pandas - 对于同一行,逐行计算基于另一列的列中字符串出现的次数?
- c# - 在 Xna/MonoGame 中将纹理编辑为 2D 数组