mapstruct是否允许从父对象中检测正确的子映射器?
我们有多个扩展父类的类,我们想要一种自动查找正确映射器的方法。
解决方案我虽然涉及mapper类的映射,但在检查对象类或类型时加载正确的映射。另一种解决方案是使用复杂的开关案例,或者使用每个可能的子类的实例。
模型示例:
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)
我们当前的解决方案涉及映射器的映射,如下所示:
@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);
...
}
还有另一种方法吗?
看看this示例(仍然是PR)上的示例repo。它提出了一个标准的mapper接口和一个存储库函数来(或多或少)实现你想要的。