MapStruct忽略@BeanMapping的qualifiedByName配置导致前后置方法全调用
问题根源
你对@BeanMapping#qualifiedByName的作用理解有误,该属性是用于筛选普通自定义类型转换方法,并不作用于@BeforeMapping/@AfterMapping标注的生命周期回调方法,因此你现在的写法所有参数匹配的回调方法都会被执行,属于框架预期行为。
解决方案
提供两种不同版本适配的实现方式:
方案1:指定回调作用的映射方法名(适配MapStruct 1.5及以上版本)
直接在@BeforeMapping/@AfterMapping注解上通过name属性绑定要生效的映射方法即可,无需额外配置:
// 映射方法无需再配置qualifiedByName public abstract MyDto toDto(MyEntity entity); @BeanMapping(ignoreByDefault = true) public abstract MyDto toPartialDto(MyEntity entity); // 仅作用于toDto方法 @BeforeMapping(name = "toDto") protected void setField1Data(@MappingTarget MyDto target, MyEntity entity) { //some code } // 仅作用于toDto方法 @AfterMapping(name = "toDto") protected void updateDto(@MappingTarget MyDto target, MyEntity entity) { //some code } // 同时作用于两个映射方法 @AfterMapping(name = {"toDto", "toPartialDto"}) protected void resolveOwn(@MappingTarget MyDto dto) { //some code } // 仅作用于toPartialDto方法 @AfterMapping(name = "toPartialDto") protected void mapPartial(@MappingTarget MyDto target, MyEntity entity) { //some code }
方案2:自定义限定符注解(适配所有MapStruct版本)
如果使用的MapStruct版本低于1.5,可以通过自定义限定注解隔离不同映射方法的回调逻辑:
- 首先自定义两个限定注解:
@Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) public @interface FullMapping {} @Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) public @interface PartialMapping {}
- 给回调方法和对应的映射方法加上匹配的限定注解:
// 映射方法添加对应限定注解 @FullMapping public abstract MyDto toDto(MyEntity entity); @PartialMapping @BeanMapping(ignoreByDefault = true) public abstract MyDto toPartialDto(MyEntity entity); // 仅全量映射触发 @FullMapping @BeforeMapping protected void setField1Data(@MappingTarget MyDto target, MyEntity entity) { //some code } // 仅全量映射触发 @FullMapping @AfterMapping protected void updateDto(@MappingTarget MyDto target, MyEntity entity) { //some code } // 两种映射都触发(不添加限定注解即可) @AfterMapping protected void resolveOwn(@MappingTarget MyDto dto) { //some code } // 仅部分映射触发 @PartialMapping @AfterMapping protected void mapPartial(@MappingTarget MyDto target, MyEntity entity) { //some code }
内容的提问来源于stack exchange,提问作者bo3hu4u
相关产品推荐
相关产品推荐

