使用当前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映射中概述的字段而不出现此编译错误?
发生的情况是,因为您在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,如下所示 我应该如何配置它?