我需要帮助将n级深度结构展平为单级对象属性。约定是使用下划线字符(level1_level2_level3)。我正在使用orika(http://orika-mapper.github.io/orika-docs/index.html)
例如
Variable1.Property1.Property2.Property3
其中Property1为Set,Property2为class,Property3为String。
使用此设置可以实现我在orika中所需的映射:
.field("Property1{Property2.Property3}", "Property1_Property2_Property3")
问题是我需要能够达到n级深度的通用解决方案。如果type是list / collection,我只会选择第一个元素(如果list / collection不为空)。
这是我想要实现的目标:
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();
}
}
}
//------------------------