当前位置: 首页 > 知识库问答 >
问题:

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

赏航
2023-03-14

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

我们的目标类“动物园”包含一些“动物”的参考。动物可以是“狮子”或“大象”。现在,我们想根据某个源类(“ZooMaker”)的属性设置狮子的长度或大象的躯干长度。

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();    
    }
}

对于这个Mapper类:

@Mapper
public abstract class AnimalMapper {

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

我们得到一个错误,如:错误:(10,9)java:未知属性teethL长度,在目标名称"animal.teeth长度"类型动物。你是说"animal.size"吗?

甚至使用Lion作为工厂的返回类型,或者使用ObjectFactory之类的

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

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

共有1个答案

吴安和
2023-03-14

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

在您的示例Zoo具有动物类型的属性动物,因此MapSTRt只能在编译期间映射到已知动物的属性。您必须执行其他操作来映射特定类型的属性。

您可以使用@AfterMap来执行instanceOf检查等。

 类似资料:
  • 我有一个简单的节点api服务、mongo服务和负载均衡器。 我正在尝试使用kubernetes部署我的应用程序,当我运行命令时,我收到以下错误。 警告错误5s(x2/8s)aws alb入口控制器实例化负载平衡器时出错:我的服务api服务不是NodePort类型,目标类型是instance 谁能告诉我我做错了什么,谢谢你。

  • 我理解超类/子类之间的关系以及强制转换是如何工作的。但是,我的问题是,如果知道中间有一个类,你能把一个超类转换成一个特定的子类吗?例如,如果我有一个动物类对象包含一个BigDog对象,我可以将该对象强制转换为Dog吗?如果BigDog中有Dog中不存在的方法怎么办? 简而言之,你当然可以说超类对象是子类对象,但为什么你可以反转呢? 转念一想, Java在调用方法时检查的是:引用(DOG)是否有引用

  • 我有一个抽象类,我应该在DTO中使用Mapalyt映射: 映射器将失败,错误:错误:没有名为“电池容量”的属性。 如何使这些字段成为可选字段,以便在源类中没有退出时具有默认值?

  • 我尝试自动连接我的mapstruct mapper: 这是可行的: 但是为什么我不能使用: 我得到以下错误: 导致原因:org . spring framework . beans . factory . nosuchbeandidefinitionexception:没有类型为“pl . comp . window . application . mapper . windowdtomapper

  • 问题内容: 假设class 扩展class 。我碰巧知道 只 包含的实例。有什么方法可以将转换为吗? 看来我唯一的选择是遍历集合,一次转换一个元素,创建一个新集合。鉴于类型擦除使得这在运行时完全不必要,这似乎完全浪费了资源。 问题答案: 您可以通过无类型的List界面进行强制转换:

  • 问题内容: 我正在尝试在Java中使用lambda和流,但我对此很陌生。当我尝试创建lambda表达式时,我在IntelliJ中收到了此错误“ lambda转换的目标类型必须是接口” 难道我做错了什么? 问题答案: 我怀疑这只是Java的类型推断不够聪明。尝试