英文:
mapstruct - target payload is subclass, no cast to real type?
问题
使用mapstruct时,我们有以下(示例)场景:
我们的目标类“Zoo”保存了对“Animal”的一些引用。动物可以是“Lion”或“Elephant”。现在我们想要根据某个源类“ZooMaker”的属性设置狮子的teethLength或大象的trunk length。
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 length;
我们想要做的是使用mapstruct动态创建Zoo中的Animal。但是,如果我们使用一个工厂类
public class PayloadFactory {
public Animal createAnimal() {
return new Lion();
}
}
对于这个Mapper类:
@Mapper
public abstract class AnimalMapper {
@Mapping(target = "animal.teethLength", source = "length")
public abstract Zoo toZoo(ZooMaker zooMaker);
...
我们会得到一个错误,类似于:
错误:(10, 9)java:在类型Animal中,目标名称为“animal.teethLength”的属性未知。“Did you mean "animal.size"?”
即使将Lion用作工厂的返回类型,或者使用ObjectFactory,如:
@ObjectFactory
public Lion createLion() {
return new Lion();
}
也会导致相同的问题?有任何解决这种类型转换问题的想法吗?
英文:
While using mapstruct we've got the following (sample) scenario:
Our target class "Zoo" holds some reference of "Animal". An animal can be a "Lion" or an "Elephant". Now we want to set the lion's teethLength or the elephant's trunk lenght depending on some source class's ("ZooMaker") property.
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;
What we wanna do is to create the Animal in Zoo dynamically using mapstruct. But, if we use a FactoryClass
public class PayloadFactory {
public Animal createAnimal() {
return new Lion();
}
}
for this Mapper class:
@Mapper
public abstract class AnimalMapper {
@Mapping(target = "animal.teethLength", source = "length")
public abstract Zoo toZoo(ZooMaker zooMaker);
...
we get an error like:
Error:(10, 9) java: Unknown property "teethLength" in type Animal for target name "animal.teethLength". Did you mean "animal.size"?
Even using Lion as Factory's return type or using an ObjectFactory like
@ObjectFactory
public Lion createLion() {
return new Lion();
}
causes the same problem? Any ideas how to solve that type conversion issue?
答案1
得分: 1
MapStruct是一个注解处理器。这意味着它只使用在编译时可用的信息,而不是运行时。
在你的示例中,Zoo
有一个类型为Animal
的属性animal
,所以MapStruct只能在编译时映射到关于Animal
已知的属性。你需要做一些其他操作来映射特定类型的属性。
你可以使用@AfterMapping
,在那里你可以进行instanceOf
检查等操作。
英文:
MapStruct is an annotation processor. This means that it uses only information available at compile time and not runtime.
In your example Zoo
has the property animal
of type Animal
, so MapStruct can only map to properties known about Animal
during compilation time. You'll have to do something else to map the type specific properties.
You can use @AfterMapping
where you can do instanceOf
checks, etc.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论