我正在做一个项目,我需要从Map<String, Object>
第二个参数应该是 aString
或的层次结构中进行映射Map<String, Object>
。到目前为止,ModelMapper 工作得很好,但我在进行特定转换时遇到了麻烦。鉴于以下情况, whereModel
只是一个标记接口:
class Client implements Model {
String firstName;
String lastName;
List<Organization> organizations = new ArrayList<>();
}
假设Organization
实现了我的标记接口Model
但在其他方面是任意结构的,我希望能够将以下内容映射到Client
:
Map source = new HashMap(){{
put("firstName", "John"),
put("lastName", "Smith"),
put("organizations", new HashMap(){{
put("0", new HashMap(){{
put("id", "1234");
}});
put("abc", new HashMap(){{
put("id", "5678");
}});
}});
}};
总而言之:我如何让 ModelMapper 删除映射键并在推入组织属性时仅使用值列表?如果做不到这一点,组织财产就会空出来。您可能会认为我有充分的理由希望这样做,而且是一个糟糕的例子!
提前感谢您的意见!
编辑
我试图构建一个Converter
可以管理从 aMap
到 a 的转换Collection<Model>
,但无济于事。鉴于:
new Converter<Map, Collection<DataTransportObject>>() {
@Override
public Set convert(MappingContext<Map, Collection<DataTransportObject>> context) {
LOG.debug("Here");
Set<DataTransportObject> result = new HashSet<>();
return result;
}
}
这有两个问题:
- 显然 ModelMapper 不考虑继承,因此当任何实现
Map
作为源给出时,转换器不会运行。例如,如果我将转换器更改为接受HashMap
并将 aHashMap
作为源传递,那么它可以工作。 context.getGenericDestinationType()
没有通用信息的返回List
或类。Set
那么 ModelMapper 是如何在正常情况下构建复杂的模型图的呢?