Java 使用基类的映射器映射子类
我的班级结构如下Java 使用基类的映射器映射子类,java,mapstruct,Java,Mapstruct,我的班级结构如下 class MapFromBase { } class MapFromChild extends MapFromBase { } class MapToBase { } class MapToChild extends MapToBase { } @Mapper interface Mapper { @Mappings(/* a lot of mappings */) MapToBase mapBase (MapFromBase value); MapTo
class MapFromBase {
}
class MapFromChild extends MapFromBase {
}
class MapToBase {
}
class MapToChild extends MapToBase {
}
@Mapper
interface Mapper {
@Mappings(/* a lot of mappings */)
MapToBase mapBase (MapFromBase value);
MapToChild mapChild (MapFromChild value);
}
是否有一种方法可以使
mapChild
映射器对从基类继承的所有字段使用mapBase
映射器,而不必手动复制所有映射?您必须将MapFromChild和MapToChild链接起来。您可以对其使用通用标记
class ChildType {
}
class Child extends ChildType {
}
class SuperChild extends ChildType {
}
class OtherChild extends ChildType {
}
class MapFromBase<T extends ChildType> {
}
class MapFromChild extends MapFromBase<Child> {
}
class MapToBase<T extends ChildType> {
}
class MapToChild extends MapToBase<Child> {
}
@Mapper
interface Mapper <X extends ChildType> {
MapToBase<X> universalMap (MapFromBase<X> value);
}
类子类型{
}
类Child扩展了ChildType{
}
类超级孩子扩展了ChildType{
}
类OtherChild扩展了ChildType{
}
类MapFromBase{
}
类MapFromChild扩展了MapFromBase{
}
MapToBase类{
}
类MapToChild扩展了MapToBase{
}
@制图员
接口映射器{
MapToBase universalMap(MapFromBase值);
}
ChildType也可以是一个接口。MapStruct有一种机制来实现。在您的情况下,我将定义一个共享映射配置(带注释的
@MapperConfig
),而不是映射程序的继承,并将此共享配置包含在您的@mapping
中。然后,@MapFromChild
和@MapFromBase
可以使用此共享配置。通过这种方式,您可以使用组合而不是继承
共享配置也可以由@MapToBase
和@MapToChild
反向继承
如果使用,则会有新选项自动继承映射器中的所有选项(以及相反的选项)创建一个方法并覆盖/调用父级?仅代码的答案通常不是很好;也许考虑增加一个解释。