亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Mapstruct - 為映射屬性找到不明確的映射方法

Mapstruct - 為映射屬性找到不明確的映射方法

嚕嚕噠 2022-06-15 09:29:59
我正在使用 mapstruct 從一個 DTO 映射到另一個。我有多個默認方法,但其中 2 個返回值為 String 并且使用與輸入參數相同的類給我“使用 java Mapstruct 的模糊映射方法”錯誤。我在這里添加代碼的相關部分:@Mappings({     @Mapping(source = "programInstance", target = "title", qualifiedByName = "title"),     @Mapping(source = "programInstance", target = "seriesName", qualifiedByName = "seriesName"),     @Mapping(source = "programInstance", target = "season", qualifiedByName = "season"),     @Mapping(source = "programInstance", target = "epNumber", qualifiedByName = "epNumber"), }) DTO1 mapDTOs (DTO2 dto2);  @Named("title")default String mapTitle(Program programInstance) {    Optional<String> title = Utils.getObject(() -> programInstance.getTitle().getDescriptions().get(0).getValue());    if (title.isPresent())        return title.get();    return null;}@Named("seriesName")default String mapSeriesName(Program programInstance) {    Optional<String> seriesName = Utils.getObject(() -> programInstance.get(0).getProgram().getTitle().getDescriptions().get(0).getValue());    if (seriesName.isPresent())        return seriesName.get();    return null;} @Named("season")default Integer mapSeasonNumber(Program programInstance) {    Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());    if (season.isPresent())        return season.get();    return null;}@Named("epNumber")default Integer mapEpNumber(Program programInstance) {    Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());    if (epNumber.isPresent())        return epNumber.get();    return null;}錯誤是發現用于將屬性“Program programInstance”映射到 java.lang.String 的不明確映射方法:java.lang.String mapTitle()、java.lang.String mapSeriesName()。
查看完整描述

2 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

我檢查了您的示例。問題是您嘗試定位的字段是字符串類型。


所以:


public class IvpVodOfferStatusDTO {


    private String seasonNumber;

    private String episodeNumber;

MapStruct 嘗試將其與您提供的簽名匹配:


 @Named("season")

default Integer mapSeasonNumber(Program programInstance) {

    Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());

    if (season.isPresent())

        return season.get();

    return null;

}


@Named("epNumber")

default Integer mapEpNumber(Program programInstance) {

    Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());

    if (epNumber.isPresent())

        return epNumber.get();

    return null;

}

MapStruct 有一個預定義的嘗試順序:

  1. 用戶提供的映射方法

  2. 直接(源-目標類型相同)

  3. 映射方法(內置)

  4. 類型轉換

如果這一切都失敗了,MapStruct 會嘗試執行一些 2 步方法:

  1. 映射方法 - 映射方法

  2. 映射方法——類型轉換

  3. 類型轉換-映射方法

在 6. 它找到了 2 個限定方法 ( Programto String)。這可能是 MapStruct 中的一個錯誤,它選擇了不符合條件的方法(需要檢查這是否是故意的)@Named。否則,我會寫一個問題。

最簡單的解決方案是:調整目標:

public class IvpVodOfferStatusDTO {


    private Integer seasonNumber;

    private Integer episodeNumber;

}

什么可能是你想要的(我猜).. 否則你可以改變簽名不返回一個Integer但String


查看完整回答
反對 回復 2022-06-15
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

我遇到了同樣的問題并觀察到,我的映射器類使用 @Mapper(uses = {BaseMapper.class}) 并使用擴展 BaseMapper 繼承了相同的方法。刪除擴展為我解決了這個問題。因此,您可以通過多種方式查找自定義映射器接收到的方法。



查看完整回答
反對 回復 2022-06-15
  • 2 回答
  • 0 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號