12基于qualifiers选择Mapping方法
如果MapStruct在将A类型转换为B类型时,匹配到多个映射方法【这些映射方法的入参都是A类型,返回值是B类型】。则程序会报编译错误,MapStruct会给出相应的提示。
我们先来看个具体的例子。
实体类型定义如下:DatapublicclassOriginalRelease{privateStringtitle;}DatapublicclassGermanRelease{privateStringtitle;}
我们有个工具类支持将title转换成德语和英语。publicclassTitles{将title转换为德语paramtitlereturnpublicStringtransTitle2German(Stringtitle){returnGerman:title;}将title转换为英语paramtitlereturnpublicStringtransTitle2English(Stringtitle){returnEnglish:title;}}
Mapper类定义如下:Mapper(usesTitles。class)publicinterfaceReleaseMapper{GermanReleasetoGerman(OriginalReleaserelease);}
上述代码编译后,会报如下错误:
AmbiguousmappingmethodsfoundformappingpropertyStringtitletoString:StringTitles。transTitle2German(Stringtitle),StringTitles。transTitle2English(Stringtitle)。Seehttps:mapstruct。orgfaqambiguousformoreinfo。
大概意思就是:MapStruct在将OriginalRelease。title转换为GermanRelease。title时。匹配到2个方法,分别是:StringTitles。transTitle2German(Stringtitle)和StringTitles。transTitle2English(Stringtitle)。
MapStruct无法决定使用哪个方法进行转换,因此报错。
针对上面的场景,MapStruct提供了qualifiers机制,供程序员明确指定使用哪个方法进行转换。
qualifiers机制提供了两种方式:qualifiedBy和qualifiedByName。下面我们分别来介绍这两种用法。
1、qualifiedBy
(1)首先我们需要定义注解,该注解用于标识我们的转换方法(MappingMethod);QualifierTarget(ElementType。METHOD)Retention(RetentionPolicy。CLASS)publicinterfaceToGerman{}QualifierTarget(ElementType。METHOD)Retention(RetentionPolicy。CLASS)publicinterfaceToEnglish{}关于定义的注解,这里说三点:
(1)该注解必须使用Qualifier标注;
(2)该注解只能作用于方法;
(3)该注解RetentionPolicy为RetentionPolicy。CLASS
(2)使用定义的注解标注转换方法(MappingMethod);
如此一来,注解和转换方法就建立了对应关系。publicclassTitles{ToGermanpublicStringtransTitle2German(Stringtitle){returnGerman:title;}ToEnglishpublicStringtransTitle2English(Stringtitle){returnEnglish:title;}}
(3)在Mapper中使用注解,指定转换方法。
为MappingqualifiedBy指定对应的注解,用于表示使用其标注的转换方法进行转换。Mapper(usesTitles。class)publicinterfaceReleaseMapper{ReleaseMapperINSTANCEMappers。getMapper(ReleaseMapper。class);Mapping(targettitle,qualifiedByToGerman。class)GermanReleasetoGerman(OriginalReleaserelease);Mapping(targettitle,qualifiedByToEnglish。class)EnglishReleasetoEnglish(OriginalReleaserelease);}
注意:这里的usesTitles。class是必须加上的,否则MapStruct会报找不到对应注解标注的转换方法。
(4)生成的Mapper实现类的代码publicclassReleaseMapperImplimplementsReleaseMapper{privatefinalTitlestitlesnewTitles();OverridepublicGermanReleasetoGerman(OriginalReleaserelease){if(releasenull){returnnull;}GermanReleasegermanReleasenewGermanRelease();germanRelease。setTitle(titles。transTitle2German(release。getTitle()));returngermanRelease;}OverridepublicEnglishReleasetoEnglish(OriginalReleaserelease){if(releasenull){returnnull;}EnglishReleaseenglishReleasenewEnglishRelease();englishRelease。setTitle(titles。transTitle2English(release。getTitle()));returnenglishRelease;}}
2、qualifiedByName
(1)使用Named注解为转换方法设置别名。publicclassTitles{Named(toGerman)publicStringtransTitle2German(Stringtitle){returnGerman:title;}Named(toEnglish)publicStringtransTitle2English(Stringtitle){returnEnglish:title;}}
(2)在Mapper中使用别名,指定转换方法。
为MappingqualifiedBy指定对应的别名,用于表示使用其标注的转换方法进行转换。Mapper(usesTitles。class)publicinterfaceReleaseMapper{ReleaseMapperINSTANCEMappers。getMapper(ReleaseMapper。class);Mapping(targettitle,qualifiedByNametoGerman)GermanReleasetoGerman(OriginalReleaserelease);Mapping(targettitle,qualifiedByNametoEnglish)EnglishReleasetoEnglish(OriginalReleaserelease);}
注意:这里的usesTitles。class是必须加上的,否则MapStruct会报找不到对应别名标注的转换方法。
绝叫出生时的诅咒头条创作挑战赛一个孩子的出生往往伴随着疼爱与赞美,那个女孩出生却伴随着来自她妈妈的诅咒其实我比较想要一个男孩。那女儿被迫降生于这个荒谬的世界,成为某人的孩子。最爱的妈妈所给予你的期
战波黑潘臻琦一分未得还四犯为啥正负值还是正八在中国女篮大胜波黑的比赛中,女篮姑娘们大部分都有亮眼的成绩,但一米九零的大前锋潘臻琦统计数据却很难看。出场时间仅有14分钟,主要集中在第一节得分0,还有4次犯规。潘臻琦一分未得,为
胡惟庸请朱元璋到家中喝酒,朱元璋走到一半,突然下令满门抄斩中国封建王朝数千年的相权政治制度中,明朝丞相胡惟庸十分荣幸,成为了宰相制度的终结者。作为中国历史上最后一个丞相,他也曾一人之上万人之下风光无限。但他的结局却让人平静不下来,更令人唏
2004年洪学智生病住院,批评前来看望的儿子你这个省长是咋当的在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论和分享,又能给您带来不一样的参与感,感谢您的支持在吉林省四平市的英雄广场内,坐落着一处战役纪念馆。它通体白色,门口的浮雕上仿佛能
如何做一个PHP自动安装程序install。php头条创作挑战赛PHP中有很多优秀的作品,为了让人们更好的安装使用,都会有一个安装引导页面,那这个页面是如何实现的呢?基本功能1生成一个conntent。php的数据库链接文件2生成
缺芯根本问题找到了?清北学霸成美芯专家,有关部门终于出手前言也正因如此,华为在最近几年斥巨资聘请尖端科研人才挑战高端的芯片研发,截止到目前始终没能交出一份显著的答卷,我国的缺芯现象已然存在。让人感到不解的是,我国是一个拥有十四亿人口的大
实践专精特新,迪米生活科技迈出重要一步近年来,随着消费者对口腔护理刚性需求的提升,电动牙刷已经成为个人口腔护理产品领域消费升级的代表之一。电动牙刷作为个护健康消费电子领域中相对成熟的新兴品类,在国内市场发展迅猛,成长空
王小川如何理解区块链?web3当下正火热,NFT已经有些过气了,今天想分享一下区块链和比特币。最近喜欢考古一些早年的视频,在youtube上刷到一个三四年前许知远采访王小川的视频,作为一个web2。0的
谈谈信息化和教育的关系(2)二教育信息化和信息化教育合力催生了智慧黑板。所谈的教学信息化和信息化教育体现在教育环境中最明显最直观的改变就是黑板信息化。而所谓的黑板信息化就是黑板科技化智能化,就是将信息技术与传
台积电创办人张忠谋身价逾600亿!靠自己成为富一代背后秘辛头条创作挑战赛台积电创办人张忠谋是打造台湾半导体产业版图的重量级人物,更是靠自己变富一代的最佳例子,他2018年6月退休前持有台积电股票12。5万张,假设他在退休后一股未卖,预估累
4个技巧,教你培养分类思维,掌握通往成功的底层逻辑作者罗西来源笔记侠转自商业的常识近日,苹果举办了2022年秋季新品发布会,发布了全新的iPhone14系列重塑的AirPodsPro以及三款新AppleWatch。虽然每年发布会都