gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:07:16 27 4
gpt4 key购买 nike

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

我们有多个扩展父类的类,并且我们希望有一种方法来自动找到正确的映射器。

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

模型示例:

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 -> ChildClass1Dto 与 ChildClass1Mapper 或 ChildClass2 -> ChildClass2Dto 与 ChildClass2Mapper)

我们当前的解决方案涉及带有映射器的 map ,如下所示:

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


@Mapper
public interface ChildClass1Mapper implements ParentClassMapper

找到合适的 map :

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

还有其他方法可以做到这一点吗?

最佳答案

看看this示例存储库中的示例(仍然是 PR)。它提出了一个标准的映射器接口(interface)和一个存储库功能来(或多或少)实现您想要的。

关于java - 如何在父对象上使用mapstruct来检测正确的子映射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55261563/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com