我有一个类,它有一个字段,而该字段又是一个抽象类。我希望 MapStruct 能够从传入的 DTO 映射到内部模型,包括抽象类的所有子字段,但我只得到空对象作为回报 - 这是正确的,因为这就是我定义映射函数的方式—.
如何才能使 MapStruct 不仅映射顶级类,还映射字段的类?我是否也必须为
Cat
和 Dog
类创建映射器,然后将它们引入 OwnerMapper
类?
提前谢谢您!
@Mapper(componentModel = MappingConstants.ComponentModel.CDI)
public interface OwnerMapper {
@Mapping(source = "pet", target = "pet", qualifiedByName = "mapPet")
Owner toEntity(OwnerDTO owner);
@Named("mapPet")
default Pet mapPet(final PetDTO pet) {
if (pet instanceof CatDTO) {
return new Cat();
} else {
return new Dog();
}
}
}
public class Owner {
private String name;
private Pet pet;
public Owner() { }
// Omitting getters and setters.
}
public abstract class Pet {
public abstract String makeNoise();
}
public final class Dog extends Pet {
private UUID dogTag;
private String name;
public Dog() { }
@Override
public String makeNoise() {
return "Bark!";
}
// Omitting getters and setters.
}
public final class Cat extends Pet {
private boolean bell;
public Cat() { }
@Override
public String makeNoise() {
return "Meow!";
}
// Omitting getters and setters.
public class OwnerDTO {
private String name;
private PetDTO pet;
public OwnerDTO() { }
// Omitting getters and setters.
public abstract class PetDTO {
}
public final class CatDTO extends PetDTO {
private UUID catTag;
private boolean bell;
public CatDTO() { }
// Omitting getters and setters.
public final class DogDTO extends PetDTO {
private UUID dogTag;
private String name;
public DogDTO() { }
// Omitting getters and setters.
嗯,我通过定义更多映射方法并从命名映射器函数调用它们来解决这个问题:
@Mapper(componentModel = MappingConstants.ComponentModel.CDI)
public interface OwnerMapper {
@Mapping(source = "pet", target = "pet", qualifiedByName = "mapPet")
Owner toEntity(OwnerDTO owner);
Cat catToEntity(CatDTO cat);
Dog dogToEntity(DogDTO dog);
@Named("mapPet")
default Pet mapPet(final PetDTO pet) {
if (pet instanceof CatDTO cat) {
return this.catToEntity(cat);
} else if (pet instanceof DogDTO dog) {
return this.dogToEntity(dog);
} else {
throw new IllegalStateException("Unsupported pet type identified");
}
}
}