我正在开展一个项目,我需要从分层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删除映射键并仅使用值列表?如果做不到这一点,组织的财产就会变空。您可能认为我有充分的理由希望这样做,而且这是一个糟糕的例子!
提前感谢您的意见!
修改
我尝试构建Converter
来管理从Map
转换为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;
}
}
。给出:
Map
这有两个问题:
HashMap
的任何实现作为源时,转换器不会运行。例如,如果我将转换器更改为接受HashMap
并传递context.getGenericDestinationType()
作为来源,则可以正常工作。List
返回Set
或{{1}}个类,但没有通用信息。那么ModelMapper如何在正常情况下设法构建复杂的模型图?答案 0 :(得分:0)
在你的情况下,我认为你可以为Pojo类使用额外的setter。 然后将转换映射到对象使用库作为ObjectMapper / BeanUtils / .... 例如:
void setOranizations(Map<String, Organization> map) {
this.organizations = map.values();
}