Сопоставление коллекций

#java #collections #dozer

#java #Коллекции #бульдозер

Вопрос:

Предположим, у меня есть следующие классы:

 class A1 {
  List<B1> bList;
}

class B1 {
  Long id;
}

---

class A2 {
  List<Long> bList;
}
  

Я хочу сопоставить класс A1 с A2 с помощью Dozer, где A1.bList содержит объекты B1, а A2.bList содержит только идентификаторы объектов B1.

Как бы выглядело сопоставление?

Спасибо.

Ответ №1:

Я думаю, вы могли бы попробовать настроить сопоставление для Long с B1 . Если я правильно помню, это работает только одним способом, я не могу вспомнить, каким именно. Извините, надеюсь, это поможет.

Комментарии:

1. можете ли вы объяснить, как настроить сопоставление между long и B1?

Ответ №2:

Вы можете использовать пользовательский конвертер dozer. Преобразователь клиентов Dozer

Пример: (возможные ошибки, не компилировался и не тестировался)

 <mapping>
  <class-a>A1</class-a>
  <class-b>A2</class-b>    
  <field custom-converter="converters.YourCustomConverter">
    <a>bList</a>
    <b>bList</b>
  </field>
</mapping>
  

Пользовательский конвертер:

 public class YourCustomConverter implements CustomConverter {

    public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
        if (source == null) {
            return null;
        }
        if (source instanceof List<?>) {
            List<?> list = ((List<?>) source);
            if (list.isEmpty()) {
                return null;
            }
            if (list.get(0) instanceof B1) {
                List<Long> longList = new ArrayList<Long>();
                for (B1 b1 : list) {
                    longList.add(b1.getId());
                }
                return longList;
            } else (list.get(0) instanceof Long) {
                // do the inverse of the above
            } else {
                throw new MappingException("Wrong type ...");
            }
        } else {
            throw new MappingException("Converter YourCustomConverter used incorrectly. Arguments passed in were:"
                      destination   " and "   source);
        }
    } 
}
  

Ответ №3:

Я думаю, вы можете сделать это, переопределив метод toString() в B1, и это сработало бы.

Вот пример кода:

 @Override
public String toString() {
return new String(this.id);
}
  

И в вашем сопоставлении внесите следующие изменения:

 <field>
 <a>bList</a>
 <b>bList</b>
 <a-hint>B</a-hint>
 <b-hint>java.lang.Long<b-hint>
</field>  
  

Итак, когда dozer попытается привязать B1, он вернет свой идентификатор в виде строки, а затем dozer выполнит автоматическое преобразование между String и Long .