首页 > 解决方案 > 将实体映射到正确的子类

问题描述

我有以下类 Entity、BaseClass、SubClass1、SubClass2。

public class Entity {
  private String field1;
  private String field2;
  private String type;
  private String field3;
  private String field4;
}
public class BaseClass {
  private String field1;
  private String field2;
  private String type;
}
public class SubClass1 extends Base {
  private String field3;
}
public class SubClass2 extends Base {
  private String field4;
}

实体是通过调用 API 获得的。根据typeBaseClass 的属性值,我想将 Entity 映射到相应的子类。

我能想到映射的一个选项如下,

@Mapper
public interface EntityMapper {
  SubClass1 mapEntityToSubClass1(Entity entity);
  
  SubClass2 mapEntityToSubClass2(Entity entity);

}

我将根据我的业务逻辑调用其中一个方法mapEntityToSubClass1或有条件地调用。由于我将从外部 API 获取列表,因此循环检查输入的类型对我来说似乎并不好。在我的业务逻辑中,目前有 4 个子类,将来可能会有更多,而且逻辑变得更加笨拙。mapEntityToSubClass2typeEntity

有没有更好的方法在 mapstruct 中实现相同的功能?

标签: javamapstruct

解决方案


不确定我是否理解正确,但您只想根据源中的字段选择要映射到哪个子类?不要在业务逻辑中这样做,只需使用默认方法即可。像这样的东西:

@Mapper
public interface EntityMapper {
    default BaseClass map(Entity entity) {
        if(entity.getType().equals("a"))
            return mapEntityToSubClass1(entity);

        if(entity.getType().equals("b"))
            return mapEntityToSubClass2(entity);

        throw new RuntimeException("Unsupported base type");
    }

    Sub1 mapEntityToSubClass1(Entity entity);

    Sub2 mapEntityToSubClass2(Entity entity);
}

推荐阅读