Mapstruct中复用@Mapping映射定义的实现方法咨询
Mapstruct中复用@Mapping映射定义的实现方法咨询
嘿,你这个复用映射配置的需求太贴合实际开发场景了!MapStruct专门提供了@InheritConfiguration注解来解决这种重复编写映射规则的问题,刚好你后来尝试的写法就是正确的方向,我来给你捋清楚细节~
首先看你最初的代码,remoteToNewLocalApp和remoteToLocalAppUpdate两个方法里重复写了相同的@Mapping配置,确实有点冗余:
@Mapper interface AppMapper { @Mapping(target = "appId", source = "atemsPackage.appId", defaultExpression = "java(packageId)") @Mapping(target = "appOnRemote", constant = "true") fun remoteToNewLocalApp(atemsPackage: AtemsPackage, packageId: String): LocalApp @Mapping(target = "appId", source = "atemsPackage.appId", defaultExpression = "java(packageId)") @Mapping(target = "appOnRemote", constant = "true") fun remoteToLocalAppUpdate(atemsPackage: AtemsPackage, packageId: String): LocalAppRemoteUpdate companion object { val INSTANCE: AppMapper = Mappers.getMapper(AppMapper::class.java) } }
而你更新后的写法就完美解决了这个问题:通过@InheritConfiguration(name = "remoteToNewLocalApp")指定要继承的方法,MapStruct会自动把remoteToNewLocalApp上的所有映射规则复用给remoteToLocalAppUpdate,不用再重复写一遍了:
@Mapper interface AppMapper { @Mapping(target = "appId", source = "atemsPackage.appId", defaultExpression = "java(packageId)") @Mapping(target = "appOnRemote", constant = "true") fun remoteToNewLocalApp(atemsPackage: AtemsPackage, packageId: String): LocalApp @InheritConfiguration(name = "remoteToNewLocalApp") fun remoteToLocalAppUpdate(atemsPackage: AtemsPackage, packageId: String): LocalAppRemoteUpdate companion object { val INSTANCE: AppMapper = Mappers.getMapper(AppMapper::class.java) } }
这里还有几个实用的细节要提醒你:
- 要确保被继承的方法和新方法的参数列表完全匹配,就像你这里两个方法都是
(AtemsPackage, String),这样继承才会生效;如果参数有差异,可能需要配合@Named或者调整参数顺序 - 如果新方法需要个别调整映射规则,完全可以在
@InheritConfiguration下面再额外加@Mapping,新的@Mapping会覆盖继承来的对应配置 - 如果你的项目里有更多方法需要复用相同的映射规则,还可以用
@MapperConfig定义一个全局的配置接口,然后在@Mapper的config属性里指定,这样整个Mapper都能复用这套规则,适合更复杂的场景
这样一来,不仅代码更简洁,后续如果要修改映射规则,只需要改被继承的那个方法即可,维护起来也方便多啦!
备注:内容来源于stack exchange,提问作者rkr87
相关产品推荐
相关产品推荐

