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会报找不到对应别名标注的转换方法。
张镇麟,代表太阳出战夏季联赛!3位本土小将,将为NBA梦想而今天,太阳队的记者公布了球队的夏季联赛名单,中国球员张镇麟在列!也就是说,在夏天,将有3位本土球员为NBA梦想而战,他们分别是张镇麟、曾凡博(步行者)以及郭昊文(独行侠)。……
27岁朱雨玲令人遗憾!从世界第一到无人问津,刘国梁也深感无奈在乒乓球这项运动中,中国一直都不缺乏名将,男队方面,远的如刘国梁、孔令辉,近的如张继科、马龙等人都是奥运会冠军,而且还是大满贯选手。女队方面,邓亚萍、王楠、张怡宁等人都是世界级……
关于火箭队夏联名单中那些大家不熟知的球员首先声明一下,本文旨在跟大家介绍一下火箭队夏联名单上那些大家不熟悉的球员,至于大家比较熟悉的克里斯托弗、加鲁巴、史密斯、伊森、尼克斯、兰姆等球员这里就不赘言了!1、37号……
腾讯ampampamp毕马威2022金融科技十大趋势展望报告本文报告来源于《2022金融科技十大趋势展望报告》,完整版共有68页,非常详尽,值得收藏。本报告下载领取方式详见文末本报告目录大纲如下:序言可信篇数据篇智能篇安全篇……
中国56项世界遗产名录世界遗产,是指被联合国教科文组织和世界遗产委员会确认的人类罕见的、目前无法替代的财富,是全人类公认的具有突出意义和普遍价值的文物古迹及自然景观。在类别上,世界遗产包括文化遗产、……
天狼星何时会爆炸,炸了会咋样,与人类有多大关系?这个题目看起来有点吓人,但请大家放心,本文只是通过天狼星会不会爆炸,来普及一些基本的天文知识,至于天狼星会不会爆炸,什么时候爆炸,看了自然就明白了。之所以把天狼星拿出来说……
那些旅行花掉的钱,最终都去了哪里?人生一定要多一些旅行体验出去旅行,钱并不是真的花掉了而是变成了见识和阅历陪伴你终生这些见识和阅历会让你越来越值钱!NO。1旅行让女人更有气质……
马龙我们今天的防守一无是处,这是我们输球的原因虎扑12月10日讯掘金以111123不敌马刺。赛后,掘金主教练迈克尔马龙接受媒体采访,谈到了本场比赛。我们抢不到篮板球,我们在篮板球上的差距对我们来说无疑是一个警醒……
白菜别再炖着吃了,学会这样做,比吃大鱼大肉还香,开胃又解馋大家好!白菜是一种日常生活中常见的食物,白菜是用很多的白菜瓣组合成一个完整的白菜,白菜瓣越里面就会越小,白菜由三个颜色组成,分别是白、黄和浅绿色,白菜里面的水分很多,做法也很多……
千年胡杨林秋意正浓,在这金秋十分,我们一家自驾去往了怪树林。怪树林位于内蒙古额济纳旗达来呼布镇西南部约28公里。昨天,我们游览了胡杨森林公园,那儿可是一片生机勃勃的景象。而今天,当我们步……
老年人别穿得太随意,学学65岁阿姨的宽窄结合穿搭法,优雅显气60岁的女人是怎样的?心态不同,呈现的状况也是天差地别。每个年龄段都有各自的状态,最重要的是要学会调节自己的心态与生活方式。一些女性到了一定年纪,常常感叹自己的穿搭不够美观,尤……
我国的人造太阳技术可控核聚变技术是被全人类寄予厚望的未来能源方式,它利用的是太阳燃烧的原理来释放热量,因此这类的实验装置常被称作人造太阳,我国中科院合肥物质科学研究院等离子体物理研究所,创造了一……