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

用mapstruct映射不同类型列表的元素

谭凯
2023-03-14
public class ParentClass{
String name;
int anotherParentField;
List<ParentClass> relation;
}

public class ChildClass1 extends ParentClass{
String customCLass1Field;
}

public class ChildClass2 extends ParentClass {
int intField;
}


public class ParentClassDto{
String name;
int anotherParentField;
List<ParentClassDto> relation;
}

public class ChildClass1Dto extends ParentClassDto{
String customCLass1Field;
}

public class ChildClass2Dto extends ParentClassDto {
int intField;
}
@Mapper
public interface ParentClassMapper{
    ParentClassDto convertToDto(ParentClass p);
    ParentClass convertDTOToModel(ParentClassDto dto);
}


@Mapper
public interface ChildClass1Mapper implements ParentClassMapper
{
    ChildClass1Dto convertToDto(ChildClass1 p);
    ChildClass1 convertDTOToModel(ChildClass1Dto dto);
}

@Mapper
public interface ChildClass2Mapper implements ParentClassMapper
{
    ChildClass2Dto convertToDto(ChildClass2 p);
    ChildClass2 convertDTOToModel(ChildClass2Dto dto);
}
{
   "name":"myName",
   "anotherParentField":"10",
   "customCLass1Field":"custom name",
   "relation":[
      {
         (This is of Object Type : ChildClass1)
         "name":"firstRelationName",
         "anotherParentField":"110",
         "customCLass1Field":"relationcustom name"
      },
      {
         (This is of Object Type : ChildClass2)
         "name":"secondRelationName",
         "anotherParentField":"110",
         "intField":"4"
      }
   ]
}
{
   "name":"myName",
   "anotherParentField":"10",
   "customCLass1Field":"custom name",
   "relation":[
      {
         "name":"firstRelationName",
         "anotherParentField":"110",
      },
      {
         "name":"secondRelationName",
         "anotherParentField":"110",
      }
   ]
}

共有1个答案

宗政权
2023-03-14

除了自定义映射器,我找不到其他方法。

下面是我用他们称之为装饰器的解决方案:

public abstract class ParentClassMapperDecorator implements ParentClassMapper {

  private final ParentClassMapper delegate;

  public ParentClassMapperDecorator(ParentClassMapper delegate) {
    this.delegate = delegate;
  }

  @Override
  public ParentClass convertDTOToModel(ParentClassDto dto) {
    ParentClass parentClass = null;

    if (dto instanceof ChildClass1Dto) {
      parentClass = Mappers.getMapper(ChildClass1Mapper.class).convertDTOToModel((ChildClass1Dto) dto);
    } else if (dto instanceof ChildClass2Dto) {
      parentClass = Mappers.getMapper(ChildClass2Mapper.class).convertDTOToModel((ChildClass2Dto) dto);
    } else {
      parentClass = this.delegate.convertDTOToModel(dto);
    }

    return parentClass;
  }

  @Override
  public ParentClassDto convertToDto(ParentClass p) {
    // Do the job here
  }
}

在ParentClassMapper中添加@decoratedWith注释:

@Mapper
@DecoratedWith(ParentClassMapperDecorator.class)
public interface ParentClassMapper {

  ParentClassDto convertToDto(ParentClass p);

  ParentClass convertDTOToModel(ParentClassDto dto);
}
@Mapper(uses = {ParentClassMapper.class})
public interface ChildClass1Mapper{

  ChildClass1Dto convertToDto(ChildClass1 p);

  ChildClass1 convertDTOToModel(ChildClass1Dto dto);
}

@Mapper(uses = {ParentClassMapper.class})
public interface ChildClass2Mapper {

  ChildClass2Dto convertToDto(ChildClass2 p);

  ChildClass2 convertDTOToModel(ChildClass2Dto dto);
}
@Test
  public void mapStruct_Inheritance_Test() throws Exception {

    ChildClass1Dto childClass1Dto = new ChildClass1Dto();
    childClass1Dto.name = "name1";
    childClass1Dto.anotherParentField = 1;
    childClass1Dto.customCLass1Field = "customCLass1Field1";

    List<ParentClassDto> parentClassDtos = new ArrayList<>();
    ChildClass1Dto childClass11Dto = new ChildClass1Dto();
    childClass11Dto.name = "name12";
    childClass11Dto.anotherParentField = 12;
    childClass11Dto.customCLass1Field = "customCLass1Field12";
    parentClassDtos.add(childClass11Dto);

    ChildClass2Dto childClass21Dto = new ChildClass2Dto();
    childClass21Dto.name = "name12";
    childClass21Dto.anotherParentField = 21;
    childClass21Dto.intField = 210;
    parentClassDtos.add(childClass21Dto);

    childClass1Dto.relation = parentClassDtos;

    ParentClass parentClass = Mappers.getMapper(ParentClassMapper.class).convertDTOToModel(childClass1Dto);
  }
 类似资料:
  • 我对Flutter编程非常陌生,我正在尝试导入一个本地JSON文件,其中包含书籍数据,如标题、作者、发布年份等。 最初我使用JSON-to-DART转换器来组装一个图书数据模型,现在我正在尝试创建一个函数,在该函数中,程序获取本地JSON文件,并使用类中的方法将数据解析为地图。 我遇到的问题是返回类型

  • 我最近开始使用mapstruct,在编码时我坚持使用一个场景。为了解决下面默认方法之间的模糊性,我试图在列表中使用“限定由” 但是第1行显示错误,因为需要指定“target”。我不确定这里的目标应该是什么,因为Line是一个集合对象。即使我不使用@mapping,mapstuct也会生成mapper实现。我阅读了mapstuct文档,但对这个场景了解不多。如何在列表上使用命名注释来明确表示这是要使

  • 我如何在下面的场景中使用Mapstruct进行bean映射。 现在我想把sourceId映射到targetId,courseName映射到subjectName,studentName映射到memberName(list到list)。

  • 你好,我正在做一个api调用,在那里我得到了一系列的横幅。我正在犯错误- 横幅。飞奔 横幅。飞奔 api_base_助手。飞奔 得到你的横幅。飞奔

  • 我是一个新的颤振和得到类型错误。我正在尝试使用json自动序列化。 在做了一些调整后这里看起来是这样的 下面是我如何尝试从api获取数据 我的类如下所示 谁能帮我一下吗。我被困在这里了。我一直在尝试不同的方法,但都不管用。非常感谢。