将实体映射到正确的子类

Map Entity to the correct subclass

我有以下 类 实体、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 获得的。根据BaseClass的type属性的值,我想把Entity映射到对应的子类

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

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

}

我将根据业务逻辑中的 type 有条件地调用方法 mapEntityToSubClass1mapEntityToSubClass2 中的任何一个。因为我将从外部 API 获取一个列表,循环检查 Entity 中的类型对我来说似乎不太好。在我的业务逻辑中,目前有 4 个 sub类,将来可能会有更多,逻辑会变得更笨拙。

在 mapstruct 中是否有更好的实现方法?

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

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