Как я могу сопоставить Список <MyObject>с List <HashMap <String, Object >> с помощью Dozer? - PullRequest
0 голосов
/ 21 июня 2011

Допустим, у меня есть объект 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.util.HashMap? То есть я хочу, чтобы результатом сопоставления был HashMap с ключом"barList", который содержит экземпляр 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 для представления HashMaps):

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

Но я хочу знать, как я могу выразить преобразование в HashMap со списком ссылок на Barтак, что я получаю это:

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

Ответы, которые не используют пользовательский маппер, предпочтительнее, но я понимаю, если это единственный способ добиться такого поведения.

1 Ответ

1 голос
/ 23 июня 2011

Вы можете сделать это в пользовательском конвертере:

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);
    }
  }

Предупреждение: код может содержать ошибки, но должен дать вам идею.

...