当前位置: 首页 > 知识库问答 >
问题:

如何忽略一些字段在MapSTRt时使用新的@子类映射注释?

弘浩博
2023-03-14

使用当前1.5.0。Beta2 MapStruct与JDK 13一起发布。

class Wrapper {
    private Fruit fruit;
}
abstract class Fruit {
    private int weight;
    /* ... */
}

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

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

(省略相应的1:1 DTO)

@Mapper(uses = {FruitMapper.class})
public interface WrapperMapper {
    WrapperDto map(Wrapper wrapper)
}

带有方法签名和注释的抽象水果类的MapSTRtMapper

@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);
}

在需要忽略引用的抽象类上的字段(例如,水果的重量)之前,上述操作可以正常工作。正在将此批注放入包装映射器映射方法。。。

@Mapping(target = "fruit.weight", ignore = true)
WrapperDto map(Wrapper wrapper)

。。。导致返回类型FruitDto是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法 编译错误。

有没有办法跳过MapStruct映射中概述的字段而不出现此编译错误?

共有1个答案

澹台锐
2023-03-14

发生的情况是,因为您在WrapperMapper上指定了它,它不会直接使用FruitMapper。相反,WrapperMapper实现将生成一个新的映射方法来映射水果。MapSTRt在此尝试中失败,并为您提供编译错误。

如果将该ignore添加到水果映射器,它将继承到两个子类映射:

        @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.命名注释添加到没有权重的映射,然后在WrapedMapper中使用它。

像这样:

    @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)
    }
 类似资料:
  • 我在通过MapStruct映射字段时遇到问题。 我有两门课。第一个域类“事件”,例如带有字段 第二类是“EventForm”。EventForm具有字段: 当我想更新现有事件时,会发生以下情况:1)我通过Id从数据库中获取现有事件 <代码>事件事件=事件服务。获取(id) 事件id=10000,lastUpdate=11213123123; 2) 我正在将字段从表单映射到域类 <代码>事件=映射器

  • 我试图映射一个bean,其中包含一些JAXB元素,如@XmlSee同样、@XmlElement、@XmlschemaType作为该类的属性。 现在,我面临着下面的问题时,使用mapSTRt映射。 > bean个人客户没有被映射。我没有在响应中看到它。但是当使用dozer时,它工作得很好。我所需要做的就是在dozer配置xml中的映射中定义它。我在mapSTRt中尝试了类似的事情。我在mapper接

  • 我想知道是否可以使用此方法忽略字段,因为我有一个要忽略的字段列表,在同一个类中,那么我该如何做呢? 我正在使用 谢谢

  • 我有一个带有Jackson注释的POJO 因此,当Jackson库被其他框架(如RestEasy)用于自动编组时,这些注释有助于指导序列化和反序列化过程。

  • 环境: jdk:17.0.1 映射:1.5.1.Final 使用默认配置,我生成了以下代码 但我想在source的所有字段都为null时返回null,如下所示 我应该如何配置它?