Estoy experimentando con MapStruct donde quiero que un mapeador use otro mapeador para combinar múltiples objetos en uno. Para mis pruebas tengo tres objetos de dominio, DomainObject1 , DomainObject2 y DomainObject3 . Quiero convertir DomainObject1 en un DTO, TransferObjectA , que tiene un campo que contiene un segundo DTO, TransferObjectB , que se construye utilizando DomainObject2 y DomainObject3 .
Tengo dos mapeadores, uno que convierte DomainObject2 y DomainObject3 a TransferObjectB que ignora un campo en DomainObject2 para que no se convierta:
@Mapper public interface ObjectBMapper { @Mapping(target = "field1", ignore = true) TransferObjectB domainObject2ToTransferObjectB(DomainObject2 domainObject2, DomainObject3 domainObject3); } Y un segundo mapeador que convierte DomainObject1 en TransferObjectA , que también acepta DomainObject2 y DomainObject3 para que puedan convertirse usando el mapeador anterior y colocar el TransferObjectA resultante:
@Mapper(uses = ObjectBMapper.class) public interface ObjectAMapper { TransferObjectA domainObject1ToTransferObjectA(DomainObject1 domainObject1, DomainObject2 domainObject2, DomainObject3 domainObject3); } Sin embargo, ObjectBMapper no parece utilizar ObjectAMapper y el field1 1 se convierte (esto da como resultado un error porque es una enum ). ¿Por qué no se usa ObjectBMapper y cómo puedo asegurarme de que ObjectAMapper lo usará?
MapStruct actualmente solo puede usar otros mapeadores con un solo parámetro de origen. Hay una solicitud de función abierta mapstruct/mapstruct#2081 sobre esta funcionalidad.
Lo que podría hacer es usar un objeto contenedor en lugar de múltiples parámetros de origen.