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
检查等
在使用 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
检查等