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

如何在父对象上使用mapstruct来检测正确的子映射器?

陈畅
2023-03-14

mapstruct是否允许从父对象检测正确的子映射器?

我们有多个扩展父类的类,我们想要一种自动找到正确映射器的方法。

我想到的解决方案涉及映射器类的映射,并在检查对象类或类型时加载正确的映射。另一种解决方案是使用复杂的switch case,或者使用每个可能的子类的实例。

模型示例:

public class ParentClass{
String getType();
}

public class ChildClass1 extends ParentClass{

}

public class ChildClass2 extends ParentClass {
}

到这个dto模型:

public class ParentClassDto{
String getType();
}

public class ChildClass1Dto extends ParentClassDto{

}

public class ChildClass2Dto extends ParentClassDto {
}

在一对一的情况下,一切都很好(ChildClass1-

我们当前的解决方案涉及一个具有以下映射器的映射:

@Mapper
public interface ParentClassMapper{
    ParentClassDto convertToDto(ParentClass p);
    ParentClass convertDTOToModel(ParentClassDto dto);
}


@Mapper
public interface ChildClass1Mapper implements ParentClassMapper

找到正确的地图:

public class MapperFinder{

    static Map<String, ParentClassMapper> map;

    static {
        map = new HashMap<>();
        map.put("ParentClassType", ParentClassMapper.class);
        map.put("ChildClass1Type", ChildClass1Mapper.class);
        map.put("ChildClass2Type", ChildClass2Mapper.class);
    }

    public ParentClassDto mapModelToDTO(ParentClass p){
        Class mapperClass = map.get(p.getType);
        MyMapper mapper = Mappers.getMapper( mapperClass );
        return mapper.convertToDto(p);
    }


    public ParentClass mapDTOToModel(ParentClassDto dto){
        Class mapperClass = map.get(dto.getType);
        MyMapper mapper = Mappers.getMapper( mapperClass );
        return mapper.convertDTOToModel(dto);
    }
}

使用将在服务中

@Autowired
MapperFinder mapperFinder;

public void save (ParentClass pc){
    (pc is a instance of child ChildClass1)
    ... 
    ParentClassDto dto = mapperFinder.mapModelToDTO(pc);
    repo.save(dto);
    ...
}

还有别的办法吗?

共有1个答案

阳建弼
2023-03-14

看看回购示例上的这个示例(仍然是PR)。它提出了一个标准的映射器接口和一个存储库功能,以(或多或少)实现您想要的。

 类似资料:
  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • 问题内容: 阅读了这篇JPA地图关系实体parentID后,我尝试将其应用于我的代码,但这对我不起作用。 这是我对象中的代码 现在这是我运行的测试 此测试行始终失败。 基于我的关系设置,Hibernate无法检索该子类别,我也不知道为什么。现在我真的很希望这对我来说不是什么愚蠢的事情,因为我会自己开枪(即使是很晚并且很累)。顺便说一下,不要介意代码中的公共变量,我正在使用play!(playfra

  • 我需要将多个dto映射到实体。几乎所有的dto都有一个指向另一个dto的引用,我不知道在映射dto时如何传递引用。 以下是该地址的一个业务实现: 这是地图绘制者 所有实现者都从同一个dto读取,然后将它们映射到dto和entites。 以下是针对客户实施的建议: 以及我希望引用映射地址实体的映射(我的客户实体有一个地址类型字段)。 非常感谢你。

  • 我创建映射如下所示。如何将平面dto对象属性(街道、城市等)映射到域对象中的嵌套地址。当我试着去做的时候,我发现了一个错误: [错误]诊断:返回类型中的属性“Address.PostalCode”未知。@Mapping(来源=“City”,目标=“Address.City”), 还有类...

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!

  • 我有如下目标实体: 源对象如下所示: