首页 文章

MapStruct相当于提示(Dozer)?

提问于
浏览
0

在Dozer中,我们能够在字段映射期间提示提示中的接口 . 我们如何在MapStruct中实现相同的目标?

我无法在这里输入确切的代码 . 但是,它与下面类似 . 我们这里有一个Domain类示例:

Class A<T extends B> extends C<T>
{ 
     ...
 };

其中,B是抽象类 . C是一个包含我们必须映射的List项的类 .

类似的是DTO端的类和接口的结构 . 因此,Dozer中的映射如下:

<mapping>
 <class-a>Domain.A</class-a> 
 <class-b>DTO.A</class-b> 
 <field>
    <a>item</a>
    <b>item</b>
    <a-hint>Domain.B</a-hint>
    <b-hint>DTO.B</b-hint>
 </field>
</mapping>

在MapStruct中,我们如何引用Dozer中提示中给出的接口?

场景:我们有:

public class ShopList<T extends Inp> extends Shop<T>\
{ ... };

哪里,

Inp是一个抽象类,其中没有字段,如:

public abstract class Inp() { };

商店是一个类:

public class Shop<T extends ShopInp> implements Serializbale 
{ private List<T> items = new ArrayList<T>(); 
//getters and setters for the items };

ShopInp是一个公共接口,其中没有字段,如:

public interface ShopInp {} .

我们在DTO端和Domain端有类似的类结构 .

你能不能让我知道上述场景的映射器会是什么样子?一般来说,如果我们尝试映射ShopList类,那么,我们如何确保T扩展ShopInp和T扩展Inp也被映射为ShopList的一部分?

1 回答

  • 0

    所谓的提示可以通过 BeanMapping#resultType 使用 . MapStruct可以使用它来创建您要映射的对象的实例 . 但是,它只会为抽象类的元素创建映射,因为它在编译期间没有其他信息(Dozer使用反射并且可以在运行时检测类型的字段) .

    想象一下,你有这种结构

    public interface Fruit {
    
        String getName();
    
        String setName(String name);
    
    }
    
    public Apple implements Fruit {
    
        ...
    }
    
    public Banana implements Fruit {
    
        ...
    
    }
    
    public abstract class FruitDto {
    
        private String name;
    
        //getters and setters
    
    }
    
    public AppleDto extends FruitDto {
    
        ...
    
    }
    
    public BananaDto extends FruitDto {
    
        ...
    
    }
    
    public class Basket {
    
        private Collection<Fruit> fruits;
    
    }
    
    public class BasketDto {
    
        private Collection<FruitDto> fruits;
    
    }
    

    您的映射器可以如下所示:

    @Mapper
    public interface BasketMapper {
    
        BasketDto map(Basket basket);
    
        @BeanMapping(resultType = BananaDto.class)
        FruitDto map(Fruit fruit);
    
    }
    

    使用此映射器 BasketDto 中的所有水果都将是 BananaDto 实例(由于 BeanMapping#resultType ,并且只会为 FruitDto 的元素创建映射

相关问题