我有两个类,它们有两种类型的关系-一个是@ManyToMany
,另一个是@OneToMany
(一个与Project
-Members of project
关系相关,另一个与Project
-Owner of project
关系相关,其中所有者与成员类型相同)。我在控制器中遇到了无限递归的问题,但很快,我设法使用@JsonIdentityInfo
解决了这个问题。但后来我意识到,其中一个类显示了太多关于客户端数据的信息--密码、用户名等,所以我创建了DTO对象,并实现了将原始对象Map到DTO的逻辑。逻辑很简单-返回DTO,这样我就可以控制公开的数据。
但是有一个问题-如果我为第一个类创建Map器来将其对象Map到DTO,那么第二个类也必须Map到DTO。但是-关于提供的示例-第二个类也必须暴露关于其所有者的信息,因此我们需要同时Map第一个类和第二个类。这就产生了循环依赖问题。
Map器类:
public class ProjectMapper {
public static ProjectDTO mapProjectToDTO(Project projectToMap) {
ProjectDTO newDTO = new ProjectDTO();
List<VolunteerDTO> listOfDTOs = projectToMap.getProjectVolunteers()
.stream()
.map(VolunteerMapper::mapVolunteerToDTO)
.collect(Collectors.toList());
newDTO.setProjectName(projectToMap.getProjectName());
newDTO.setProjectDescription(projectToMap.getProjectDesription());
newDTO.setProjectLocation(projectToMap.getProjectLocation());
newDTO.setProjectStatus(projectToMap.isProjectStatus());
newDTO.setProjectDate(projectToMap.getProjectDate());
newDTO.setProjectOpinions(projectToMap.getProjectOpinions());
newDTO.setProjectOwner(VolunteerMapper.mapVolunteerToDTO(projectToMap.getOwnerVolunteer()));
newDTO.setProjectVolunteers(listOfDTOs);
newDTO.setTasks(projectToMap.getTasks());
newDTO.setRequiredSkills(projectToMap.getRequiredSkills());
return newDTO;
}
public static void mapPropertiesToProject(Project sourceProject, Project targetProject) {
targetProject.setProjectName(sourceProject.getProjectName());
targetProject.setProjectDate(sourceProject.getProjectDate());
targetProject.setProjectVolunteers(sourceProject.getProjectVolunteers());
targetProject.setProjectDesription(sourceProject.getProjectDesription());
targetProject.setProjectLocation(sourceProject.getProjectLocation());
targetProject.setProjectOpinions(sourceProject.getProjectOpinions());
targetProject.setProjectStatus(sourceProject.isProjectStatus());
}
}
个字符
模型类:
@Data
public class ProjectDTO {
private String projectName;
private String projectDescription;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate projectDate;
private List<VolunteerDTO> projectVolunteers;
private VolunteerDTO projectOwner;
private String projectLocation;
private List<String> requiredSkills;
private boolean projectStatus;
private List<Opinion> projectOpinions;
private List<String> tasks;
}
@Data
public class VolunteerDTO {
private String name;
private String surname;
private LocalDate dateOfBirth;
private String contact;
private List<String> skills;
private List<ProjectDTO> projects;
private Integer reputation;
private List<String> interests;
}
的字符串
1条答案
按热度按时间dtcbnfnu1#
问题
个字符
mapProjectToDto调用mapVolunteerToDTO,后者再次调用mapProjectToDto。
您可以根据您的业务案例以不同的方式打破这个循环
1-在不使用ProjectDto列表的情况下创建VolunteerDto,无论何时需要这样的列表,都可以使用VolunteerDto Id获取它
2-使ProjectDto不包含VolunteerDto列表(与1相同)
3-make VolunteerDto包含项目列表Id,而不是ProjectDTO列表
4-使ProjectDTO包含VolunteerIds而不是VolunteerDto的列表
我更喜欢3楼,但这完全取决于你的商业案例