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

使用mapstruct映射Hierrachical Bean

楚苏燕
2023-03-14

这是这个问题的延伸。

 class Customer{
  // distinct properties
}
class RetailCustomer extends Customer{
  // distinct properties
}

class WholeSaleCustomer extends Customer{
 // distinct properties
}

class CustomerDO {
 // String custType ; // flag used to determine if Customer is wholeSale or Retail
 //few properties same as Customer/WholeSaleCustomer/RetailCustomer
 // few distinct properties
}

@Mapper
public interface CustomerMapper{

           default Customer toCustomer(CustomerDO customerDO) {
                 String custType = customerDO.getCustType();
                if("W".equalsIgnoreCase(custType)){
                   return toWholeSaleCustomer(customerDO);
                  }
                 else {
                  return toRetailCustomer(CustomerDO);
                   }
           }
        @Mappings({
              @Mapping(source="a", target="b"),
               @Mapping(source="c", target="d"),
               @Mapping(source="m", target="m")
            })
         WholeSaleCustomer toWholeSaleCustomer(CustomerDO customerDO);

       @Mappings({
              @Mapping(source="e", target="f"),
               @Mapping(source="g", target="h"),
               @Mapping(source="n", target="n")
            })
         RetailCustomer toRetailCustomer(CustomerDO customerDO);
}

我需要根据CustomerDO中的custType标志从CustomerDO映射到批发商客户/零售商客户。但是上面定义的映射器不起作用。编译时,它给我以下错误

 CustomerMapper.java:[23,34] Ambiguous mapping methods found for mapping property "com.domain.CustomerDO customerDO" to com.role.Customer: com.role.Customer: toCustomer
r(com.domain.CustomerDO customerDO), com.role.WholeSaleCustomer toWholeSaleCustomer(com.domain.CustomerDO wsCustomer), com.role.RetailCustomer toRetailCustomer(com.domain.CustomerDO wsCustomer)

但是如果我将toCustomer(CustmerDo CusterDO)签名更改为toCustomer(Object CusterDO)并删除其中任何一个toWholeSaleCustomer/toRetailCustomer,它就可以工作了。它只会映射两种类型中的任何一种。但我都想要。我对Service Bean有类似的案例。有几个子服务。我应该能够在需要时映射它们。

共有1个答案

楚昊明
2023-03-14

您正在寻找的是基于限定符的映射方法选择。

因此,如果您的客户对象如下所示:

class WholeSaleCustomer extends Customer {
 // distinct properties
}

class CustomerDO {
 // String custType ; // flag used to determine if Customer is wholeSale or Retail
 //few properties same as Customer/WholeSaleCustomer/RetailCustomer
 // few distinct properties
    private CustomerDO customerDO;
}

然后您必须告诉MapSTRt它需要使用哪个方法来执行映射。所以你的映射器看起来像:

@Mapper
public interface CustomerMapper {

        @Named("baseCustomer")
        default Customer toCustomer(CustomerDO customerDO) {
            String custType = customerDO.getCustType();
            if("W".equalsIgnoreCase(custType)){
                return toWholeSaleCustomer(customerDO);
            }
            else {
                return toRetailCustomer(CustomerDO);
            }
        }

        @Mappings({
            @Mapping(source="customerDO", qualifiedByName = "baseCustomer"),
            @Mapping(source="c", target="d"),
            @Mapping(source="m", target="m")
        })
        WholeSaleCustomer toWholeSaleCustomer(CustomerDO customerDO);

        @Mappings({
            @Mapping(source="customerDO", qualifiedByName = "baseCustomer"),
            @Mapping(source="g", target="h"),
            @Mapping(source="n", target="n")
        })
        RetailCustomer toRetailCustomer(CustomerDO customerDO);
}

< code>@Named应来自< code>org.mapstruct.Named。

 类似资料:
  • 我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?

  • 我对这些技术是新的,所以提前道歉。 我在我的应用程序中使用了springboot、Spring JPA、hibernate和mapstruct。

  • 我想映射2个模型,其中每个模型都有几乎相同的枚举。让我展示: 第一个模型有枚举: 第二个模型具有枚举: 我有这样的自定义映射方法: 然后我用: 但是你可以得到: 我还创建了枚举映射器,如: 但我不需要单独设置,只希望枚举字段映射到内部映射中。简单地说,当我做枚举时,也应该映射。 谢谢 p、 对不起我的英语,希望我的问题有意义:)

  • 是否可能在MapStruct中使用不同的映射器?我有这个映射器 是否可以将此实现更改为MapStruct?

  • 按照第二个链接中包含的示例,我已经测试了: 但我没有实现使用。

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->

  • 下面的例子中,我有一个单独的域层和一个单独的持久层。我使用Mapstruct进行映射,当从域映射到实体或从实体映射到域时,会出现堆栈溢出,因为双向引用总是被调用- 用于映射的类非常基本

  • 我想将泛型类型<code>Y</code>的对象映射到另一个泛型类型为<code>X</code>的对象。在mapstruct中有这样的功能吗?或者我必须为通用映射编写自定义映射器吗?当我编译上面的代码时,会出现编译错误。