Java Orika-将对象映射到列表(一对多映射)

Java Orika-将对象映射到列表(一对多映射),java,orika,Java,Orika,我有以下两门课 class A { class InnerA { private String field; // getters/setters } private Collection<InnerA> collection; // getters/setters } class B { private String field; // getters/setters } 当然,您可以映射它

我有以下两门课

class A {
    class InnerA {
        private String field;

        // getters/setters
    }

    private Collection<InnerA> collection;

    // getters/setters
}

class B {
    private String field;

    // getters/setters
}

当然,您可以映射它,您只需将InnerA公开:

List<B> dest = mapper.mapAsList(sourceA.getCollection(), B.class);
List dest=mapper.mapAsList(sourceA.getCollection(),B.class);
如果InnerA不是公共的,则Orika不能使用它

MapperFacade映射器=新的ConfigurableMapper(){
@凌驾
受保护的无效配置(MapperFactory工厂){
registerMapper(新的CustomMapper(){
@凌驾
public void mapAtoB(A,集合b,MappingContext上下文){b.addAll(mapperFacade.mapAsList(A.Collection,b.class));
(B)项目:B){
item.propertyA=a.propertyA;
}
}               
});             
registerConcreteType(Collection.class、ArrayList.class);
}           
};  
最终类型collectionOfB=新的TypeBuilder(){}.build();
Collection dest=mapper.map(source,TypeFactory.valueOf(A.class),collectionfb);

类路径中是否有orika的多个版本?否,通过maven检查了dependency:tree。Orika 1.4.0和Javassist 3.17.1-GA。第一句话如果你想让Orika访问你的InnerA,InnerA必须是公共的和静态的。是的,这个答案很有用,但是如果我想在每个B中添加A的属性呢?i、 e.每个B.属性中的属性A.propertyA?Orika自动映射无法处理此问题,但您可以创建一个自定义映射器来实现它并注册到MapperFactory,并为Mapper.mapAsList(sourceA.getCollection(),B.class)使用自动映射器;//对于InnerAB,则使用普通Java将属性从A设置为B的每个实例
java.lang.VerifyError: Inconsistent args count operand in invokeinterface in method    ma.glasnost.orika.generated.Orika_ArrayList_A_Mapper845657274.mapAtoB(Ljava/lang/Object;Ljava/lang/Object;Lma/glasnost/orika/MappingContext;)V at offset 74  
at java.lang.Class.getDeclaredConstructors0(Native Method)  
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2404)  
at java.lang.Class.getConstructor0(Class.java:2714)     
at java.lang.Class.newInstance0(Class.java:343)     
at java.lang.Class.newInstance(Class.java:325)  
List<B> dest = mapper.mapAsList(sourceA.getCollection(), B.class);
MapperFacade mapper = new ConfigurableMapper() {
    @Override
    protected void configure(MapperFactory factory) {
    factory.registerMapper(new CustomMapper<A, Collection<B>>() {
        @Override
        public void mapAtoB(A a, Collection<B> b, MappingContext context) {                     b.addAll(mapperFacade.mapAsList(a.collection, B.class));

            for(B item : b) {
                item.propertyA = a.propertyA;
            }
        }               
    });             
    factory.registerConcreteType(Collection.class, ArrayList.class);
        }           
};  
final Type<Collection<B>> collectionOfB = new TypeBuilder<Collection<B>>() {}.build();
Collection<B> dest = mapper.map(source, TypeFactory.valueOf(A.class), collectionOfB);