Выравнивание вложенных свойств Orika

#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. Я загрузил код, но знаете ли вы, как продолжить сопоставление, когда я сталкиваюсь с вложенным свойством?