2017-01-18 17 views
1

Рассмотрим следующую ситуацию:Orika: Как отобразить с помощью вложенного картографа

public class A { 

    private ClassInA classInA; 

    public ClassInA getClassInA() { 
     return classInA; 
    } 

    public void setClassInA(ClassInA classInA) { 
     this.classInA = classInA; 
    } 

} 

public class B { 

    private ClassInB classInB; 

    public ClassInB getClassInB() { 
     return classInB; 
    } 

    public void setClassInB(ClassInB classInB) { 
     this.classInB = classInB; 
    } 

} 

public class ClassInA { 

    private String myString; 

    public String getMyString() { 
     return myString; 
    } 

    public void setMyString(String myString) { 
     this.myString = myString; 
    } 

} 

public class ClassInB { 

    private String myString; 

    public String getMyString() { 
     return myString; 
    } 

    public void setMyString(String myString) { 
     this.myString = myString; 
    } 

} 

Теперь я хочу, чтобы отобразить A с B использованием Orika. Мне нужен конвертер для этого. Как:

public class MyMapper { 

    @Override 
    protected void configure(MapperFactory factory) { 
     ConverterFactory converterFactory = factory.getConverterFactory(); 
     converterFactory.registerConverter(new MyConverter()); 

     factory.classMap(A.class, B.class) // 
       .field("classInA", "classInB") // 
       .register(); 
    } 
} 

public class MyConverter extends CustomConverter<ClassInA, ClassInB> { 

    @Override 
    public ClassInB convert(ClassInA source, Type<? extends ClassInB> destinationType) { 
     ClassInB classInB = new ClassInB(); 
     classInB.setMyString(source.getMyString()); 
     return classInB; 
    } 

} 

Хотя картостроитель для ClassInA к ClassInB будет лучше. Как:

public class MyMapper extends ConfigurableMapper { 

    @Override 
    protected void configure(MapperFactory factory) { 
     factory.classMap(ClassInA.class, ClassInB.class) // 
       .byDefault 
       .register(); 
    } 
} 

К сожалению, я не имею ни малейшего понятия, как зарегистрировать картограф в MyMapper. Нет ничего подобного converterFactory.registerMapper(new MyMapper());. Единственный способ, которым я мог это сделать, -

.customize(
    return new CustomMapper<LoanContractRequestValue, LoanContrReqERPCrteReqLoanContr>() { 
     @Override 
     public void mapAtoB(A source, B destination, MappingContext context) { 
      destination.setMyString(source.getMyString()); 
     } 
    }; 
) 

Но разве это действительно так?

ответ

1

Вы можете зарегистрировать несколько классов классов в том же mapperFactory, Orika будет знать, какой из них использовать на основе класса/типа.

public class MyMapper extends ConfigurableMapper { 
    @Override 
    protected void configure(MapperFactory factory) { 
     factory.classMap(A.class, B.class) 
       .field("classInA", "classInB") 
       .register(); 

     factory.classMap(ClassInA.class, ClassInB.class) 
       .byDefault 
       .register(); 
    } 
}