5

我正在做一个项目,我需要从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;
    }
}

这有两个问题:

  1. 显然 ModelMapper 不考虑继承,因此当任何实现Map作为源给出时,转换器不会运行。例如,如果我将转换器更改为接受HashMap并将 aHashMap作为源传递,那么它可以工作。
  2. context.getGenericDestinationType()没有通用信息的返回List或类。Set那么 ModelMapper 是如何在正常情况下构建复杂的模型图的呢?
4

1 回答 1

0

在你的情况下,我认为你可以为 Pojo 类使用额外的设置器。然后将映射转换为对象,使用 ObjectMapper/BeanUtils/... 等库。例如:

void setOranizations(Map<String, Organization> map) {
    this.organizations = map.values();
}
于 2014-11-28T20:38:44.227 回答