范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

12基于qualifiers选择Mapping方法

  如果MapStruct在将A类型转换为B类型时,匹配到多个映射方法【这些映射方法的入参都是A类型,返回值是B类型】。则程序会报编译错误,MapStruct会给出相应的提示。
  我们先来看个具体的例子。
  实体类型定义如下:@Data public class OriginalRelease {      private String title;  } @Data public class GermanRelease {      private String title;  }
  我们有个工具类支持将title转换成德语和英语。public class Titles {      /**      * 将title 转换为 德语      *      * @param title      * @return      */     public String transTitle2German(String title) {         return "German: " + title;     }      /**      * 将title 转换为 英语      *      * @param title      * @return      */     public String transTitle2English(String title) {         return "English: " + title;     } }
  Mapper类定义如下:@Mapper(uses = Titles.class) public interface ReleaseMapper {      GermanRelease toGerman(OriginalRelease release);  }
  上述代码编译后,会报如下错误:
  Ambiguous mapping methods found for mapping property "String title" to String: String Titles.transTitle2German(String title), String Titles.transTitle2English(String title). See https://mapstruct.org/faq/#ambiguous for more info.
  大概意思就是:MapStruct在将OriginalRelease.title转换为GermanRelease.title时。匹配到2个方法,分别是:String Titles.transTitle2German(String title) 和 String Titles.transTitle2English(String title)。
  MapStruct无法决定使用哪个方法进行转换,因此报错。
  针对上面的场景,MapStruct提供了qualifiers机制 ,供程序员明确指定使用哪个方法进行转换。
  qualifiers机制提供了两种方式:qualifiedBy 和 qualifiedByName。下面我们分别来介绍这两种用法。
  1、qualifiedBy
  (1)首先我们需要定义注解,该注解用于标识我们的转换方法(Mapping Method);@Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) public @interface ToGerman { }  @Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) public @interface ToEnglish { }关于定义的注解,这里说三点:
  (1)该注解必须使用@Qualifier标注;
  (2)该注解只能作用于方法;
  (3)该注解RetentionPolicy为RetentionPolicy.CLASS
  (2)使用定义的注解 标注转换方法(Mapping Method);
  如此一来,注解和转换方法就建立了对应关系。public class Titles {          @ToGerman     public String transTitle2German(String title) {         return "German: " + title;     }          @ToEnglish     public String transTitle2English(String title) {         return "English: " + title;     }      }
  (3)在Mapper中使用注解,指定转换方法。
  为@Mapping#qualifiedBy指定对应的注解,用于表示使用其标注的转换方法进行转换。@Mapper(uses = Titles.class) public interface ReleaseMapper {      ReleaseMapper INSTANCE = Mappers.getMapper(ReleaseMapper.class);      @Mapping(target = "title", qualifiedBy = ToGerman.class)     GermanRelease toGerman(OriginalRelease release);      @Mapping(target = "title", qualifiedBy = ToEnglish.class)     EnglishRelease toEnglish(OriginalRelease release);  }
  注意:这里的uses = Titles.class是必须加上的,否则MapStruct会报找不到对应注解标注的转换方法。
  (4)生成的Mapper实现类的代码public class ReleaseMapperImpl implements ReleaseMapper {      private final Titles titles = new Titles();      @Override     public GermanRelease toGerman(OriginalRelease release) {         if ( release == null ) {             return null;         }          GermanRelease germanRelease = new GermanRelease();          germanRelease.setTitle( titles.transTitle2German( release.getTitle() ) );          return germanRelease;     }      @Override     public EnglishRelease toEnglish(OriginalRelease release) {         if ( release == null ) {             return null;         }          EnglishRelease englishRelease = new EnglishRelease();          englishRelease.setTitle( titles.transTitle2English( release.getTitle() ) );          return englishRelease;     } }
  2、qualifiedByName
  (1)使用@Named注解为转换方法设置别名。public class Titles {      @Named("toGerman")     public String transTitle2German(String title) {         return "German: " + title;     }      @Named("toEnglish")     public String transTitle2English(String title) {         return "English: " + title;     }  }
  (2)在Mapper中使用别名,指定转换方法。
  为@Mapping#qualifiedBy指定对应的别名,用于表示使用其标注的转换方法进行转换。@Mapper(uses = Titles.class) public interface ReleaseMapper {      ReleaseMapper INSTANCE = Mappers.getMapper(ReleaseMapper.class);      @Mapping(target = "title", qualifiedByName = "toGerman")     GermanRelease toGerman(OriginalRelease release);      @Mapping(target = "title", qualifiedByName = "toEnglish")     EnglishRelease toEnglish(OriginalRelease release);  }
  注意:这里的uses = Titles.class是必须加上的,否则MapStruct会报找不到对应别名标注的转换方法。

开门红!中国航天2023首发成功!1月9日6时00分,CZ7A运载火箭在中国文昌航天发射场点火升空,成功将实践二十三号等三颗卫星送入预定轨道,卫星主要用于开展科学试验技术验证等领域。2023年,中国航天发射任务首战疑似外星文明的无线电信号WOW信号!它似乎来自人马座方位1977年8月15日位于美国俄亥俄立州大学的一个名叫大耳朵的射电望远镜,探测到了一个来自太阳系之外的惊人信号WOW信号。大耳朵射电望远镜WOW信号这个信号是目前探测外星生命最著名的爱叨叨的郭艾伦回来了,球迷怒骂,他却哭着说网友说当那个没事就喜欢和裁判叨叨的郭艾伦回来时,真正的郭艾伦就回来了。最近两场,你可以肉眼可见的感觉到郭艾伦的变化。进攻上更主动了,更喜欢要球了,脸上的笑容多了,跟队友的交流多了,谷爱凌美国生活惬意!衣着清凉身材好,与男模亲密,国籍问题明朗谷爱凌在加入中国籍,并帮助中国队夺得几乎所有世界大赛冠军后,成为了中国冰坛第一人,也顺利爆红全球,随之而来的,还有大量国际大牌代言合同,她的身家瞬间暴涨至10个亿以上,更加让人欣慰世界杯最火辣球迷火辣不减!开着好几千万布加迪,透视装很辣在卡塔尔世界杯上,一位穿搭超级性感的克罗地亚小姐伊万娜,只要有克罗地亚的比赛,她都穿着非常性感的红白格纹衣服亮相,球迷们被她吸引到了,这场世界杯结束后,这位最火辣的世界杯球迷,自己一大批事业编岗位发布!部分面向应届生在求职金牌荐岗新年新气象,求职正当时!新一批优质好岗来了。今天,我们重点推荐八大热门招聘资讯,涵盖事业单位医疗机构和学校等,涉及中小学教师医师护士信息技术工程管理项目管理公证员助理等多个岗位。其国乒换帅后首秀马龙4个110光速获胜球迷愤怒国际乒联大忽悠经过换教练大调整后,中国乒乓球队重拳出击德班世乒赛亚洲区预选赛,以队长马龙双打首秀开始。没想到下午三点开始的比赛中国队以4个110光速获胜,不少球迷3点5分打开直播就发现已经结束了中国乒乓定档!票房预计20亿,球迷差评!没有真正的球星北京时间的1月7日,在世乒赛预选赛的赛场上,中国选手虽然没有过多的比赛需要参与,是从球员的实力来看,完全可以在预选赛的舞台展现出最强悍的实力。中国乒乓球队向来以稳健著称,基本上都能谁注意到朱芳雨发的动态?3年了,球迷终于等到了好消息!东莞接待办开始动起来了,想吃什么菜系的各位来之前吱一声。广东宏远总经理朱芳雨,在社交媒体上写道。CBA官方宣布,篮协已经批准,联赛的第3阶段将恢复主客场制,比赛将在三月上旬拉开帷幕欲与华为苹果掰手腕,高通入局卫星通信继华为和苹果之后,高通也瞄上了卫星通信。CES2023期间,高通宣布与铱星通信公司(Iridium)达成协议,为下一代Android旗舰智能手机提供基于卫星的连接,并发布全球首个可雷军预言成真?iPhone份额持续走低,我们国产崛起的时候到了?说到苹果与华为这两大手机厂商,相信屏幕前的大家应该都是不陌生的吧?毕竟在过去很长一段的时间里,华为一直都作为我们国产手机品牌的代表,在国际市场与苹果这样的手机厂商相抗衡。不过后续华
国王6换1报价戴维斯!詹姆斯有望迎来1812小球中锋的辅助?头条创作挑战赛报价背景湖人在取得5连胜后,由于詹姆斯和戴维斯的缺阵,又遭遇了失利,战绩来到19胜22负,依然排在西部第12,但对于湖人来说,并非不可接受,他们仅仅比西部第六多输了1约基奇28分钟21189仍无缘今日最佳!抱歉!你碰到暴走的布朗了今日NBA赛场有8组对决,多位球员表现出色,掘金的约基奇就是其中之一,在掘金vs太阳的比赛中,约基奇三节打卡,他出战28分钟,15中10,3罚1中,得到21分18板9助攻1抢断,带詹姆斯上赛季最后没进季后赛,我就不想出场去争得分王近日,湖人前锋勒布朗詹姆斯接受了ESPN的专访。谈到在他接近打破历史得分纪录的同时湖人本赛季胜率仍不足50,詹姆斯说我想赢球,这个战绩让我不满意。我不喜欢在取得成就的时候当它们出现爆冷!东部垫底队送湖人大礼!赢球就进西部前十,老詹别再掉链子NBA常规赛,东部垫底队活塞爆出大冷,他们以135118大胜森林狼。活塞赛前11胜33负,排名东部垫底。森林狼20胜21负排名西部第九,而且他们4连胜势头正旺。双方上半场还打得有来布朗4112塔图姆3110凯尔特人擒鹈鹕!麦科勒姆38分北京时间1月12日,NBA常规赛迎来了一场东西部的强强对话,由新奥尔良鹈鹕队客场挑战波士顿凯尔特人队。鹈鹕上场比赛战胜奇才,过去一段时间胜少负多的他们以25胜16负排名西部第三的位JR附体,2亿先生被喷惨!场均35分仍不够!这队阵容豪华但还要拆公牛97100不敌奇才,比赛最后时刻出现了争议性的一幕,NBA史上最著名的神经刀选手JR史密斯在赛后被多次提及。面对着比尔和波尔津吉斯缺阵的奇才,拉文单核带队与奇才缠斗到了最后一刻莫兰特38分小贾伦2112凯尔登24分灰熊再胜马刺豪取8连胜直播吧1月12日讯NBA常规赛继续进行,灰熊主场再战马刺,上一场比赛缺少了莫兰特的灰熊依然战胜马刺豪取7连胜,稳居西部第2名,而马刺则是2连败,目前排在西部第14位。比赛开始,双方周琦起诉新疆,杜锋爱将离队!辽篮大外援自曝归队,广厦裁掉库克头条创作挑战赛虽然周琦近来正忙着与CBA老东家新疆广汇打官司,但据澳洲媒体透露,NBL东南凤凰队对于周琦的续约持乐观态度。作为无缘CBA的备胎,周琦在东南凤凰队虽然工资拿得少,上场2笔签约达成,独行侠酝酿大交易!NBA神级纪录诞生,大帝太难了NBA常规赛激战正酣,各支球队朝着既定目标迈进,各路球星重拳出击大放异彩。NBA官方公布了最新一期的新秀排行榜,具体如下班凯罗高居榜首,马瑟林屈居第2,艾维位列第3,第410位分别佩利斯特里的经纪人正在飞往英格兰,为曼联首次亮相据报道,法昆多佩利斯特里(FacundoPellistri)的经纪人正在飞往英格兰,以便在他的球员为俱乐部首次亮相后完成从曼联的转会。2020年,红魔斥资约900万英镑从乌拉圭球队斯诺克大师赛八强出炉特鲁姆普上演大逆转,14决赛对阵全部敲定北京时间1月12日,斯诺克大师赛正赛首轮最后两场比赛结束,特鲁姆普后来居上连赢三局上演大逆转65绝杀了瑞恩戴,宾汉姆依靠开局连赢五局的爆棚表现以63击溃了90后名将凯伦威尔逊,这样