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

Mapstruct-忽略嵌套集合中的字段-克隆对象时不工作

李捷
2023-03-14

我有以下实体类和类似的DTO类:

class Car {
    Long id;
    List<Owner> ownerList;
}

class Owner {
    Long id;
    String name;
}

我使用MapSTRt进行以下映射:

  1. 复制到无ID的CarDto
    @Mapping(target = "id", ignore = true)
    @Mapping(target = "ownerList", qualifiedByName = "withoutIdDto")
    CarDto carToCarDto(Car car);

    @Named("withoutIdDto")
    @Mapping(target = "id", ignore = true)
    OwnerDto mapOwnerDtoWithoutId(Owner owner);
    @Mapping(target = "id", ignore = true) //ignore Car.id
    @Mapping(target = "ownerList", qualifiedByName = "withoutId")
    Car copyCar(Car car);

    @Named("withoutId")
    @Mapping(target = "id", ignore = true) //ignore Owner.id
    Owner mapOwnerWithoutId(Owner owner);

问题是:

carToCarDto()的生成映射器正在调用MapownerToWithoutId(),但copyCar方法没有调用mapOwnerWithoutId()。以下是生成的方法片段:

public Car copyCar(Car car) {
    if (car == null) {
        return null;
    } else {
        Car car1 = new Car();
        List<Owner> list = car.getOwnerList();
        if (list != null) {
            car1.setOwnerList(new ArrayList(list)); // no reference to mapOwnerWithoutId
        }

        return car1;
    }
}

public CarDto carToCarDto(Car car) {
    if (car == null) {
        return null;
    } else {
        CarDto carDto = new CarDto();
        carDto.setOwnerList(this.ownerListToOwnerDtoList(car.getOwnerList())); //ownerListToOwnerDtoList () calls mapOwnerDtoWithoutId
        return carDto;
    }
}

我有以下项目来复制这个。知道如何修复测试CarMapperTest吗?

https://github.com/gtiwari333/mapstruct-failing-test-same-object-copy

共有1个答案

越姚石
2023-03-14

MapSTRt处理的方式有所不同1.源元素和目标元素相同的列表(一行)2.源元素和目标元素不同的列表。

就我个人而言,我不喜欢这种差异,但它已经存在很长时间了。我有点担心当我们改变这一点时(并且总是做2.)我们可能会破坏一些实现。

尽管如此,我仍然认为MapStruct应该更喜欢可用的方法,而不是直接映射。请在我们的GitHub上写一个问题,并参考这一个。

现在,一种解决方法是定义这样的中间映射方法:列表映射(List s)。MapStruct将生成该实现并调用它。

 类似资料:
  • 我需要一些使用MapStruct映射嵌套POJO的帮助。我需要跳过/删除目标类中所有子类的特定字段。 例如,以下是我的目标POJO 所有这些子类——,,。。。包含一个字段“”,我想在映射时忽略它。这种结构使得这些类不共享包含此字段的公共基类——“”。 我创建的映射器如下所示: 这工作。 然而,当中的子类数量很大时,它会变得很乏味。我需要明确指定每个类。 有没有人能告诉我,这是否可以用一种更通用的方

  • 我使用以下映射器映射实体: 对于映射为集合的实体,我只需要忽略“数据”字段。但看起来仅适用于单个实体。我还注意到生成的方法只是在for循环中使用。对此有什么解决方案吗?

  • 我有以下内容: 我想忽略在RegimenEntity中设置的regimenDrugs内的所有RegimenDrugEntity对象的id。 此映射(target=“regimenDrugs.id”,ignore=true)不编译。

  • 我有一个对象,其中包含几个列表。有没有一种方法来克隆这个对象,没有id使用mapstruct,即使是嵌套的对象列表,以自动的方式能够持久化它。 实际制图员 有没有一种方法可以忽略所有id,而不必对每个列表进行@Mapping(target=“id”,ignore=true)?

  • 我有以下DTO和域对象。我正在使用Mapstruct将域对象复制到DTO对象。 使用下面的映射器将域映射到DTO。我不想将电话属性从域映射到DTO。怎么做?我尝试在mapping ignore中提供嵌套目标属性,但它给出了错误:

  • 假设我有这些实体: null