#java #nested #flatten #orika
#java #вложенные #выравнивание #orika
Вопрос:
Мне нужна помощь в сглаживании n-уровневой глубокой структуры до одноуровневых свойств объекта. Соглашение заключается в использовании символа подчеркивания (level1_level2_level3). Я использую orika (http://orika-mapper.github.io/orika-docs/index.html )
Например.
Variable1.Property1.Property2.Property3
где задано свойство1, Свойство2 — класс, а Свойство3 — строка.
Мое необходимое сопоставление в orika может быть достигнуто с помощью этого параметра:
.field("Property1{Property2.Property3}", "Property1_Property2_Property3")
Проблема в том, что мне нужно общее решение, которое может иметь глубину n уровней. Если тип — список / коллекция, я бы взял только первый элемент (если список / коллекция не пусты).
Вот чего я хочу добиться:
Class1 {
String property1;
Set<Class2> property2;
}
Class2 {
String property3;
Class3 property4;
}
Class3 {
String property5;
}
MapHere {
String property1;
String property2_property3;
String property2_property4_property5;
}
Обновить:
Вот реализация FlattenClassMapBuilder на случай, если кому-то это понадобится: http://pastie.org/9324242
А также сопоставление по пакету:
String aPrefix = "com.something.domain";
String bPrefix = "com.something.dto";
//----------------------
Reflections reflections = new Reflections(aPrefix, new SubTypesScanner(false));
//uzmi sve klase iz paketa koji je dat u aPrefix putanji (recimo "com.nesto.nesto1")
Set<Class<?>> aClasses = reflections.getSubTypesOf(Object.class);
reflections = new Reflections(bPrefix, new SubTypesScanner(false));
//uzmi sve klase iz paketa koji je dat u bPrefix putanji (recimo "com.nesto.nesto2")
Set<Class<?>> bClasses = reflections.getSubTypesOf(Object.class);
for(Class<?> aClass : aClasses)
{
for(Class<?> bClass : bClasses)
{
if(aClass.getSimpleName().equals(bClass.getSimpleName()))
{
//za sve klase iz aPrefix-a cije se ime poklapa sa klasom iz bPrefix-a
mapperFactory.classMap(aClass, bClass).byDefault().register();
}
}
}
//------------------------
Ответ №1:
На самом деле Orika может справиться с этим, но вы должны предоставить эту политику автоматического сопоставления, предоставив реализацию для DefaultFieldMapper
В исходном коде / тестах Orika есть несколько примеров.
Комментарии:
1. Я попробовал этот подход, но я дошел до шага, на котором мне нужно сопоставить List<> property (в моем случае Property1), но на самом деле мне нужно Property1 . Property2.Property3 — это вложенное свойство этого.
2. Или вы даже можете использовать provide свой собственный ClassMapBuilder / Factory, переопределить метод byDefault для реализации вашей политики. Например, когда вы сталкиваетесь со списком <->PropertX, вы можете зарегистрировать конвертер по идентификатору. В некоторых случаях регулярно используйте конвертеры (для списка<->propertyX), как только алгоритм будет вам понятен, вы можете его автоматизировать (DefaultFieldMapper / пользовательский ClassMapBuilder). Orika предоставляет много точек расширения, это зависит от каждого случая / необходимости, какой из них выбрать.
3. у вас есть какой-нибудь пример этого? Вот сопоставление, которого я хочу достичь: (отредактированный исходный вопрос)
4. Вот пример, который пытается выполнить сопоставление без учета регистра gist.github.com/elaatifi/7009879
5. Я загрузил код, но знаете ли вы, как продолжить сопоставление, когда я сталкиваюсь с вложенным свойством?