【问题标题】:MapStruct: trouble with abstract classMapStruct:抽象类的问题
【发布时间】:2017-02-01 11:12:15
【问题描述】:

我在 MapStruct 使用抽象类时遇到了一些问题。 我有 2 个映射器:

MapperA extends AbstractMapper<U,V>
MapperB extends AbstractMapper<U,V>

MapperA 使用 MapperB

我在AbstractMapper有一个方法

public <T extends AbstractReference> T resolveReference(String id, @TargetType Class<T> entityClass) {
    // Some implementation
}

在全新安装时,我得到了模棱两可的方法错误。

似乎 Mapstruct 找到该方法两次,每个 Mapper 扩展同一个类一次。

我对限定符进行了一些搜索,但在使用具有相同签名的不同方法时似乎很有用。但在我的情况下,它是一样的!!

如果你有任何整数。

谢谢

编辑:

    @Mapper(componentModel = "cdi", uses = {MapperB.class}) 
    @ApplicationScoped 
    public abstract class MapperA extends AbstractMapper<U1,V1> {} 

MapperB 不使用任何其他映射器。

    @Mapper(componentModel = "cdi")
    @ApplicationScoped
    public abstract class MapperB extends AbstractMapper<U2,V2> {}

【问题讨论】:

  • 你能展示使用你的映射器定义吗?您是在 MapperB 中使用 MapperA 还是相反?
  • @Mapper(componentModel = "cdi", uses = {MapperB.class}) @ApplicationScoped public abstract class MapperA extends AbstractMapper {} MapperB 不使用任何其他映射器。跨度>
  • 为什么要在映射器上声明这些类型参数?它们在哪里使用?

标签: java class abstract mapstruct


【解决方案1】:

您实际上没有一种方法,您有两种方法。一个在MapperA,另一个在MapperB。 MapStruct 不关心继承和每个方法所在的位置。

也是你的方法

public <T extends AbstractReference> T resolveReference(String id, @TargetType Class<T> entityClass) {
    // Some implementation
}

是泛型,具有相同的擦除,不依赖于AbstractMapper泛型参数,导致MapStruct的模棱两可的方法错误。

我不确定您在该方法中实际做了什么。但如果它是不依赖于AbstractMapper 泛型参数UV 的泛型,那么我建议您将此方法提取到不同的类中,并将该类添加到uses 注释变量中。

如果方法依赖于参数,请确保它们是其中的一部分,然后 MapStruct 将正常工作,因为它们在编译期间将具有不同的类型(U1, V1U2, V2

【讨论】:

  • 我认为你在写,我应该使用带有 uses 注释的不同类(我们称之为 MapperUtil)。但是如果 MapperA 和 MapperB 使用 MapperUtil 类,问题还是一样,方法还是会出现两次。
  • 不,它不会,如果你使用 MapperUtill 类,那么 MapStruct 会知道它来自同一个类,这应该不是问题。请参阅@gunnar 对您的问题的评论。如果您使用 resolveReference 中的类型,那么它应该也可以工作。
  • 感谢您的回答,它适用于 MapperUtil 类:)
  • 太好了。如果它有效,你可能会接受我的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2015-04-06
  • 1970-01-01
  • 2012-11-15
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多