在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 回答
所谓的提示可以通过
BeanMapping#resultType
使用 . MapStruct可以使用它来创建您要映射的对象的实例 . 但是,它只会为抽象类的元素创建映射,因为它在编译期间没有其他信息(Dozer使用反射并且可以在运行时检测类型的字段) .想象一下,你有这种结构
您的映射器可以如下所示:
使用此映射器
BasketDto
中的所有水果都将是BananaDto
实例(由于BeanMapping#resultType
,并且只会为FruitDto
的元素创建映射