如何使用<MyObject>推土机将列表映射到列表<哈希映射<字符串,对象>>?



假设我有一个对象Foo,它包含对对象Bar:的引用列表

public class Foo{
    String fooStr;
    List<Bar> barList;
    //get/set barList/someStr go here
}
public class Bar {
    String barStr;
}

使用Dozer,假设Bar到java.util.HashMap是一个平凡的映射,我如何将Foo的实例映射到java.util.HashMap的实例,以便Bar的引用实例也映射到java.til.HashMap也就是说,我希望映射的结果是一个键为"barList"的HashMap,它包含ArrayList>的一个实例。该列表中的每个HashMap都应该是Bar到HashMap的映射。

例如,如果Foo只引用了一个Bar而不是一个列表,我会这样做:

<mapping>
    <class-a>Foo</class-a>
    <class-b>java.util.Map</class-b>
    <field>
        <a>bar</a>
        <b key="bar">this</b>
        <a-hint>Bar</a-hint>
        <b-hint>java.util.Map</b-hint>
    </field>
</mapping>

这将生成一个如下所示的哈希映射(使用JSON对象表示哈希映射):

{
    "fooStr" : "value of fooStr",
    {
       "barStr" : "value of barStr"
    }
}

但我想知道如何通过对Bar的引用列表来表达对HashMap的转换,这样我就得到了:

{
    "fooStr" : "value of fooStr",
    "barList" : [{ "barStr" : "bar1" }, { "barStr" : "bar2" }, ...]
}

不使用自定义映射器的答案是首选的,但我理解这是否是实现这种行为的唯一方法。

您应该能够在自定义转换器中做到这一点:

public class Foo {
    String fooStr;
    List<Bar> barList;
    ...
}
public class Bar {
    String barStr;
}
public class Target {
    String fooStr;
    Map<String, Bar> barMap;   
}

public class TestCustomConverter implements CustomConverter {
  public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
    if (source == null) {
      return null;
    }
    if (source instanceof Foo) {
      Map<Bar> dest = null;
      // check to see if the object already exists
      if (destination == null) {
        dest = new Target();
      } else {
        dest = (Target) destination;
      }
      ((Target) dest).setFooStr(source.getFooStr());
      for(Bar : source.getBarList()) {
          ((Target) dest).getBarMap().put(bar.getBarStr(), bar);
      }
      return dest;
    } else if (source instanceof Target) {
      Foo dest = null;
      // check to see if the object already exists
      if (destination == null) {
        dest = new Foo ();
      } else {
        dest = (Foo) destination;
      }
      dest.getFoos().addAll(((Target)source).getBarMap().values());
      dest.setFooStr(((Target)source).getFooStr()):
      return dest;
    } else {
      throw new MappingException("Converter TestCustomConverter used incorrectly. Arguments passed in were:"
          + destination + " and " + source);
    }
  }

警告:代码可能包含错误,但应该给你一些想法。

最新更新