如何在Dozer中映射集合

Ste*_*ier 23 java mapping data-mapping dozer

我想做点什么:

ArrayList<CustomObject> objects = new ArrayList<CustomObject>();
...
DozerBeanMapper MAPPER = new DozerBeanMapper();
...
ArrayList<NewObject> newObjects = MAPPER.map(objects, ...); 
Run Code Online (Sandbox Code Playgroud)

假设:

<mapping>
  <class-a>com.me.CustomObject</class-a>
  <class-b>com.me.NewObject</class-b>   
    <field>  
      <a>id</a>  
      <b>id2</b>  
    </field>  
</mapping>
Run Code Online (Sandbox Code Playgroud)

我试过了 :

ArrayList<NewObject> holder = new ArrayList<NewObject>();
MAPPER.map(objects, holder);
Run Code Online (Sandbox Code Playgroud)

但是持有者对象是空的.我也没有运气改变第二个参数...

Ste*_*ier 32

报价:

"嵌套集合是自动处理的,但你认为顶层集合需要迭代是正确的.目前还没有一种更优雅的方法来处理它."

有人在你的代码库中没有循环结构的情况下找到了一种方法,但我认为将它放在你的代码中会更容易(并且更易读/可维护).希望他们能早点加入这种能力.


Mic*_*l-7 9

我遇到了类似的问题,并决定使用通用实用程序方法来避免每次需要执行此类映射时进行迭代.

public static <T, U> List<U> map(final Mapper mapper, final List<T> source, final Class<U> destType) {

    final List<U> dest = new ArrayList<>();

    for (T element : source) {
        dest.add(mapper.map(element, destType));
    }

    return dest;
}
Run Code Online (Sandbox Code Playgroud)

用法将是这样的:

    final List<CustomObject> accounts..... 
    final List<NewObject> actual = Util.map(mapper, accounts, NewObject.class);
Run Code Online (Sandbox Code Playgroud)

可能这可以进一步简化.


Yis*_*hai 5

发生的事情是你被类型擦除所困扰.在运行时,java只能看到一个ArrayList.class.类型CustomObjectNewObject不存在,所以Dozer试图映射a java.util.ArrayList,而不是你CustomObjectNewObject.

什么应该工作(完全未经测试):

List<CustomObject> ori = new ArrayList<CustomObject>();
List<NewObject> n = new ArrayList<NewObject>();
for (CustomObject co : ori) {
    n.add(MAPPER.map(co, CustomObject.class));
}
Run Code Online (Sandbox Code Playgroud)