当前位置: 首页 > 知识库问答 >
问题:

hint(推土机)的MapStruct等价物?

越学文
2023-03-14

在Dozer中,我们能够在字段映射期间在提示中提到接口。我们如何在MapStruct中实现同样的功能呢?

我不能把确切的代码放在这里。但是,它与下面类似。这里有一个域类示例:

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

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

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() { };

Shop是一个类像:

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侧和畴侧有相似的类结构。

你能告诉我在上面的场景中映射器是什么样子的吗?一般来说,如果我们尝试映射ShopList类,那么,我们如何确保T extends ShopInp和T extends Inp也被映射为ShopList的一部分呢?

共有1个答案

鞠源
2023-03-14

所谓的提示可以通过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的元素创建映射

 类似资料:
  • 我试图使用Dozer映射UUID字段,遇到了Dozer github上提到的一个问题: https://github.com/DozerMapper/dozer/issues/83 问题是-显然,Dozer依赖于UUID中不存在的默认无参数构造函数。因此,该链接显示了如何告知推土机执行参考复制。然而,使用该提示并没有帮助,我仍然会遇到以下异常: org.dozer.java.lang.java.u

  • 我有四门课: 从我在dozer留档中读到的关于继承的内容来看,它必须非常简单,我需要将超级类相互映射,以及子类。以下是它在xml中的外观: 所有这些类都是相同的,我的意思是D和D具有相同的属性,C和C等等。 问题:在我传递给dozer的对象中,我有一个类型为B的属性,它可以由C或D(多态性)初始化。当dozer返回新的映射对象时,它总是将属性类型B返回给我,而不是C或D。如何解决这个问题?

  • 我在Spring启动时使用推土机映射器。如果我将数据从实体映射到EntityDTO,那么dozer maper的工作就是将数据从实体类复制到EntityDTO,对于原语也是如此。但是假设我有这样一门课 和名称为EntityDTO的DTO 那么它不会将数据从entityChild映射到EntityChildTos,有人能帮我解决这个问题吗?

  • 我是使用dozer的新手。我需要将集合映射到一个类,该类是集合中源类的属性。我有如下类技术 我想映射到 哪里 我的推土机绘图将是什么样子?

  • 问题内容: 我正在寻找Python中的地球移动器的距离(或快速EMD)实现。关于在哪里找到它的任何线索,我在网上已经看够了。我想在我正在做的图像检索项目中使用它。谢谢。 编辑:我发现了使用纸浆库的一个非常好的解决方案。该页面还包含设置所需的说明。 问题答案: OpenCv for Python中有一个出色的实现。该函数的名称为CalcEMD2,用于比较两个图像直方图的简单代码如下所示: 我使用Py

  • 我试图在open mp中并行化的代码是一个Monte Carlo代码,它可以归结为以下内容: 我想确保随机数生成器的状态是跨线程共享的,并且对结果的添加是原子的。 有没有办法用strust::omp中的东西替换这个代码。从我到目前为止所做的研究来看,strust::omp更多地是一个指令,用于使用多个CPU线程,而不是GPU进行一些标准的strust操作。