当字段是抽象类型时,MapStruct 将模型的字段映射为空

问题描述 投票:0回答:1

我有一个类,它有一个字段,而该字段又是一个抽象类。我希望 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.

DTO 课程

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.
field abstract mapstruct
1个回答
0
投票

嗯,我通过定义更多映射方法并从命名映射器函数调用它们来解决这个问题:

@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");
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.