我正在开发一个项目,需要从一个分层的Map<String, Object>
进行映射,其中第二个参数应该是一个String
或者Map<String, Object>
。到目前为止,ModelMapper工作得非常好,但我遇到了一个特定的转换问题。给定以下代码,其中Model
只是一个标记接口:
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放弃映射键,而仅使用值列表来推入organizations属性呢?如果失败,organizations属性将为空。你可以假设我有一个很好的理由希望这样做,但这只是一个反例!感谢您提前的支持!
编辑
我尝试构建一个转换器来管理从Map到Collection的转换,但没有成功。给定:
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
并传递一个HashMap
作为源,则它可以工作。 context.getGenericDestinationType()
返回没有泛型信息的List
或Set
类。那么在正常情况下,ModelMapper如何构建复杂的模型图呢?