mapstruct - 目标负载是子类,没有转换为真实类型?

mapstruct - target payload is subclass, no cast to real type?

在使用 mapstruct 时,我们有以下(示例)场景:

我们的目标class“Zoo”包含一些“Animal”的参考。动物可以是“狮子”或“大象”。现在我们要根据某些来源 class 的(“ZooMaker”)属性.

设置狮子的 teethLength 或大象的躯干长度
class Zoo {
 Animal animal;
...
class Animal {
 long size;
...
class Lion extends Animal {
 long teethLength;
...
class Elephant extends Animal{
 long trunkLength;
...
class ZooMaker {
String animal;
long lenght;

我们想要做的是使用 mapstruct 动态创建动物园中的动物。但是,如果我们使用 FactoryClass

public class PayloadFactory {

    public Animal createAnimal() {
      return new Lion();    
    }
}

对于这个映射器 class:

@Mapper
public abstract class AnimalMapper {

    @Mapping(target = "animal.teethLength", source = "length")
    public abstract Zoo toZoo(ZooMaker zooMaker);
...

我们收到如下错误: 错误:(10, 9) java:目标名称“animal.teethLength”的 Animal 类型未知 属性“teethLength”。您是说“animal.size”吗?

甚至使用 Lion 作为 Factory 的 return 类型或使用像

这样的 ObjectFactory
@ObjectFactory
    public Lion createLion() {
        return new Lion();
    }

导致同样的问题?有什么想法可以解决该类型转换问题吗?

MapStruct 是一个注解处理器。这意味着它仅使用编译时可用的信息,而不使用运行时可用的信息。

在您的示例中 Zoo 具有类型 Animal 的 属性 animal,因此 MapStruct 只能在编译期间映射到关于 Animal 已知的属性.您必须执行其他操作才能映射特定于类型的属性。

您可以使用 @AfterMapping 进行 instanceOf 检查等