spring Map器循环依赖

pftdvrlh  于 2023-08-02  发布在  Spring
关注(0)|答案(1)|浏览(65)

我有两个类,它们有两种类型的关系-一个是@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;

}

的字符串

dtcbnfnu

dtcbnfnu1#

问题

public static ProjectDTO mapProjectToDTO(Project projectToMap) {
    List<VolunteerDTO> listOfDTOs = projectToMap.getProjectVolunteers()
                    .stream()
                    ====>> .map(VolunteerMapper::mapVolunteerToDTO) <<===
                    .collect(Collectors.toList());
}

个字符
mapProjectToDto调用mapVolunteerToDTO,后者再次调用mapProjectToDto。
您可以根据您的业务案例以不同的方式打破这个循环
1-在不使用ProjectDto列表的情况下创建VolunteerDto,无论何时需要这样的列表,都可以使用VolunteerDto Id获取它
2-使ProjectDto不包含VolunteerDto列表(与1相同)
3-make VolunteerDto包含项目列表Id,而不是ProjectDTO列表
4-使ProjectDTO包含VolunteerIds而不是VolunteerDto的列表
我更喜欢3楼,但这完全取决于你的商业案例

相关问题