#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 .