Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MapStruct忽略对象中列表中的属性_Java_Many To Many_Dto_Mapstruct - Fatal编程技术网

Java MapStruct忽略对象中列表中的属性

Java MapStruct忽略对象中列表中的属性,java,many-to-many,dto,mapstruct,Java,Many To Many,Dto,Mapstruct,我有这个: @Entity public class Upgrade { ... @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "UPGRADE_PROJECT", joinColumns = @JoinColumn(name = "UPGRADE_ID"), inverseJoinColumns = @JoinColumn(name = "PROJECT_ID")) priv

我有这个:

@Entity
public class Upgrade {
    ...
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "UPGRADE_PROJECT", joinColumns = @JoinColumn(name = "UPGRADE_ID"),
            inverseJoinColumns = @JoinColumn(name = "PROJECT_ID"))
    private List<Project> projects = new ArrayList<>();...}

我使用的映射器如下所示:

    CycleAvoidingMappingContext cycleAvoidingMappingContext = new CycleAvoidingMappingContext();
    Upgrade upgrade = upgradeMapper.upgradeDtoToUpgrade(upgradeDTO, cycleAvoidingMappingContext);
    upgrade = setupAndSave(versionId, upgrade);
    return upgradeMapper.upgradeToUpgradeDto(upgrade, cycleAvoidingMappingContext);
我在创建升级时得到以下结果:

{
    "id": 1804,
    "version": {
        "id": 2007,
        "technology": {
            ...
        },
       ..
    },
    ...
    "projects": [
        {
            "id": 603,
            ...
    THIS SHOULD BE IGNORED
            "upgrades": [
                {
                    "id": 1703,

                    "projects": [
                        {
                            "id": 603,

                            "upgrades": [
                                1703,
                                {
                                    "id": 1704,

                                    "projects": [
                                       AND GOES ON AND ON
                                    ],

                                },
                                ..,
                                ..
                            ],
                            ..
                        },
                        {
                            "id": 604,
                            "upgrades": [
                                1703,
                                1704,
                                1803,
                                1804
                            ],
                            ..
                        }
                    ],
                    ..
                },
                1704,
                1803,
                1804
            ],
           ...
        },
        {
            "id": 604,
            "upgrades": [
                1703,
                1704,
                1803,
                1804
            ],
            ..
        }
    ],
    ..
}
我希望能做这样的事情

public interface UpgradeMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "acquired", dateFormat = "MMMM yyyy")
    @Mapping(target = "projects.upgrades", ignore = true)
    UpgradeDTO upgradeToUpgradeDto(Upgrade upgrade, @Context CycleAvoidingMappingContext context);
但它不起作用,因为
projects
是一个列表,而不是一个实体

我目前的解决方案是:

@Mapper(componentModel = "spring", uses = {UpgradeMapper.class, YearMonthMapper.class})
public interface ProjectMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MMMM yyyy")
    @Mapping(target = "toDate", dateFormat = "MMMM yyyy")
    @Mapping(target = "upgrades", ignore = true)
    ProjectDTO projectToProjectDto(Project project, @Context CycleAvoidingMappingContext context);
因此,当我从数据库中获取一个项目实体并获取DTO时,DTO将升级为空

我想知道有没有一种方法可以实现我的目标而不牵扯到关系的另一面

计划

{
    "id": 603,
    "upgrades": [],
    "createdAt": "10/June/2020  at 14:58:47"
}
升级(这是期望的行为)

编辑

根据菲利普的建议,现在地图绘制者是这样的:

@Mapper(componentModel = "spring", uses = {UpgradeMapper.class, YearMonthMapper.class})
public interface ProjectMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MMMM yyyy")
    @Mapping(target = "toDate", dateFormat = "MMMM yyyy")
    ProjectDTO projectToProjectDto(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "upgrades", ignore = true)
    @InheritConfiguration
    @Named("withoutUpgrades")
    ProjectDTO projectToProjectDtoWithoutUpgrades(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MM-yyyy")
    @Mapping(target = "toDate", dateFormat = "MM-yyyy")
    Project projectDtoToProject(ProjectDTO projectDTO, @Context CycleAvoidingMappingContext context);
}
@Mapper(componentModel = "spring", uses = {UpgradeMapper.class, YearMonthMapper.class})
public interface ProjectMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MMMM yyyy")
    @Mapping(target = "toDate", dateFormat = "MMMM yyyy")
    ProjectDTO projectToProjectDto(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "upgrades", ignore = "true"
    @InheritConfiguration
    @Named("withoutUpgrades")
    ProjectDTO projectToProjectDtoWithoutUpgrades(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MM-yyyy")
    @Mapping(target = "toDate", dateFormat = "MM-yyyy")
    Project projectDtoToProject(ProjectDTO projectDTO, @Context CycleAvoidingMappingContext context);
}


而且它仍然不起作用,它仍然使用
projectToProjectDto
而不是
projecttoprojectdtow而不升级。怎么了?

您可以使用限定符忽略映射

e、 g


这意味着当升级中的
项目
映射完成时,它将使用未经
验证的映射而不进行升级
来映射项目。

尝试使用列表添加方法。感谢很多人的帮助,我只需要添加关系的其他方向
{
    "id": 603,
    "upgrades": [],
    "createdAt": "10/June/2020  at 14:58:47"
}
{
    "id": 1804,
    "version": {
        "id": 2007,

    },
   ..
    "projects": [
        {
            "id": 603,
            ..
            "upgrades": [],
            "createdAt": "10/June/2020  at 14:58:47"
        },
        {
            "id": 604,
            ..
            "upgrades": [],
            "createdAt": "10/June/2020  at 14:59:59"
        }
    ],
    "createdAt": "10/June/2020  at 15:59:52"
}
@Mapper(componentModel = "spring", uses = {UpgradeMapper.class, YearMonthMapper.class})
public interface ProjectMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MMMM yyyy")
    @Mapping(target = "toDate", dateFormat = "MMMM yyyy")
    ProjectDTO projectToProjectDto(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "upgrades", ignore = true)
    @InheritConfiguration
    @Named("withoutUpgrades")
    ProjectDTO projectToProjectDtoWithoutUpgrades(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MM-yyyy")
    @Mapping(target = "toDate", dateFormat = "MM-yyyy")
    Project projectDtoToProject(ProjectDTO projectDTO, @Context CycleAvoidingMappingContext context);
}
@Mapper(componentModel = "spring", uses = {VersionMapper.class, ProjectMapper.class,
        YearMonthMapper.class})
public interface UpgradeMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "acquired", dateFormat = "MMMM yyyy")
    @Mapping(target = "projects", qualifiedByName = "withoutUpgrades")
    UpgradeDTO upgradeToUpgradeDto(Upgrade upgrade, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "acquired", dateFormat = "MM-yyyy")
    Upgrade upgradeDtoToUpgrade(UpgradeDTO upgradeDTO, @Context CycleAvoidingMappingContext context);

}
@Mapper(componentModel = "spring", uses = {UpgradeMapper.class, YearMonthMapper.class})
public interface ProjectMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MMMM yyyy")
    @Mapping(target = "toDate", dateFormat = "MMMM yyyy")
    ProjectDTO projectToProjectDto(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "upgrades", ignore = "true"
    @InheritConfiguration
    @Named("withoutUpgrades")
    ProjectDTO projectToProjectDtoWithoutUpgrades(Project project, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "fromDate", dateFormat = "MM-yyyy")
    @Mapping(target = "toDate", dateFormat = "MM-yyyy")
    Project projectDtoToProject(ProjectDTO projectDTO, @Context CycleAvoidingMappingContext context);
}
@Mapper(componentModel = "spring", uses = {VersionMapper.class, ProjectMapper.class,
        YearMonthMapper.class})
public interface UpgradeMapper {

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "acquired", dateFormat = "MMMM yyyy")
    @Mapping(target = "projects", qualifiedByName = "withoutUpgrades")
    UpgradeDTO upgradeToUpgradeDto(Upgrade upgrade, @Context CycleAvoidingMappingContext context);

    @Mapping(target = "createdAt", dateFormat = "dd/MMMM/yyyy [ 'at' HH:mm:ss]")
    @Mapping(target = "acquired", dateFormat = "MM-yyyy")
    Upgrade upgradeDtoToUpgrade(UpgradeDTO upgradeDTO, @Context CycleAvoidingMappingContext context);

}