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