首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在使用新的@子类映射注释时忽略MapStruct中的某些字段?

如何在使用新的@子类映射注释时忽略MapStruct中的某些字段?
EN

Stack Overflow用户
提问于 2021-12-29 15:30:53
回答 1查看 210关注 0票数 0

初始情况

使用当前的1.5.0Beta 2 MapStruct版本和JDK 13。

领域模型

代码语言:javascript
运行
复制
class Wrapper {
    private Fruit fruit;
}
代码语言:javascript
运行
复制
abstract class Fruit {
    private int weight;
    /* ... */
}

class Apple extends Fruit {
    /* ... */
}

class Banana extends Fruit {
    /* ... */
}

(相应略去1:1 DTO)

地图绘制者

包装类的Mapper

代码语言:javascript
运行
复制
@Mapper(uses = {FruitMapper.class})
public interface WrapperMapper {
    WrapperDto map(Wrapper wrapper)
}

水果类地图(Es)

具有方法签名和注释的MapStruct Mapper for 抽象 Fruit类:

代码语言:javascript
运行
复制
@Mapper(subclassExhaustiveStrategy = SubclassExhaustiveStrategy.RUNTIME_EXCEPTION /*...*/)
public interface FruitMapper {
    @SubclassMapping(source = Apple.class, target = AppleDto.class)
    @SubclassMapping(source = Banana.class, target = BananaDto.class)
    FruitDto map(Fruit fruit);
}

问题

上面的内容可以正常工作,直到需要在引用的抽象类上忽略一个字段(例如,weightFruit)。将此注释放入WrapperMapper map方法..。

代码语言:javascript
运行
复制
@Mapping(target = "fruit.weight", ignore = true)
WrapperDto map(Wrapper wrapper)

...leads到The return type FruitDto is an abstract class or interface. Provide a non abstract / non interface result type or a factory method.编译错误。

问题

是否有一种方法可以跳过MapStruct映射中的字段而不获取此编译错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-02 13:45:36

原因

因为您在WrapperMapper上指定了它,所以它不会直接使用FruitMapper。相反,WrapperMapper实现将得到一个新的映射方法来映射结果。MapStruct在此尝试中失败,并给出了编译错误。

解决方案

如果将该忽略添加到FruitMapper中,它将继承到两个子类映射:

代码语言:javascript
运行
复制
        @SubclassMapping( source = Apple.class, target = AppleDto.class )
        @SubclassMapping( source = Banana.class, target = BananaDto.class )
        @Mapping( target = "weight", ignore = true )
        FruitDto map( Fruit fruit );

如果您想要有权重的映射和没有权重的映射,您可以将@org.mapstruct.Named注释添加到没有权重的映射中,然后在WrappedMapper中使用该注释。

就像这样:

代码语言:javascript
运行
复制
    @Mapper(subclassExhaustiveStrategy = SubclassExhaustiveStrategy.RUNTIME_EXCEPTION /*...*/)
    public interface FruitMapper {
        @SubclassMapping( source = Apple.class, target = AppleDto.class )
        @SubclassMapping( source = Banana.class, target = BananaDto.class )
        FruitDto map( Fruit fruit );

        @SubclassMapping( source = Apple.class, target = AppleDto.class )
        @SubclassMapping( source = Banana.class, target = BananaDto.class )
        @Mapping( target = "weight", ignore = true )
        @Named( "NoWeights" )
        FruitDto map( Fruit fruit );
    }

    @Mapper(uses = {FruitMapper.class})
    public interface WrapperMapper {
        @Mapping( target = "fruit", qualifiedByName = "NoWeights" )
        WrapperDto map(Wrapper wrapper)
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70521530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档