Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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使用列表避免循环问题<;A>;B类中的属性_Java_List_Circular Dependency_Relation_Mapstruct - Fatal编程技术网

Java Mapstruct使用列表避免循环问题<;A>;B类中的属性

Java Mapstruct使用列表避免循环问题<;A>;B类中的属性,java,list,circular-dependency,relation,mapstruct,Java,List,Circular Dependency,Relation,Mapstruct,如果我有一个班级ProfessorDto和一个班级StudentDto如果ProfessorDto有一个StudentDto列表,StudentDto有一个ProfessorDto类型的属性,我如何避免循环问题? 我没有给出域类的代码,但假设它与Dto的代码相同 我是Mapstruct的新手,将一个域bean转换成一个Dto,它具有简单的属性,如Long、String,但在我的示例中,关系OneToMany不起作用 @JsonApiResource(type = "professor") @No

如果我有一个班级ProfessorDto和一个班级StudentDto如果ProfessorDto有一个StudentDto列表,StudentDto有一个ProfessorDto类型的属性,我如何避免循环问题? 我没有给出域类的代码,但假设它与Dto的代码相同

我是Mapstruct的新手,将一个域bean转换成一个Dto,它具有简单的属性,如Long、String,但在我的示例中,关系OneToMany不起作用

@JsonApiResource(type = "professor")
@NoArgsConstructor
@Data
public class ProfessorDto {

  @JsonApiId
  private Long id;

  private String professorName;

  @JsonApiRelation(mappedBy = "professor")
  private List<StudentDto> student;

  public ProfessorDto(Long id) {
    this.id = id;
  }
}
我为教授绘制的地图是

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface ProfessorMapper {

  ProfessorDto domainToDto(Professor domain);

  Professor dtoToDomain(ProfessorDto dto);

  StudentDto studentToDto(Student student);

  Student studentDtoToDomain(StudentDto studentDto);

  List<StudentDto> studentToDto(List<Student> student);

  List<Student> studentDtoToDomain(List<StudentDto> studentDto);
}
@Mapper(componentModel=“spring”,unappedTargetPolicy=ReportingPolicy.IGNORE)
公共接口映射器{
领域教授(领域教授);
德托多姆教授(德托教授);
学生对学生(学生);
StudentToDomain(StudentToStudentTo);
列出学生TOTO(列出学生);
列出studentDto域(列出studentDto);
}

使用@Context注释查看此示例

有关@Context注释的更多信息,请参见下面的Mapstruct文档


首先,您应该决定是否真的需要将
列表
聚合到
ProfessorDto
。如果可能的话,你可以把它排除在外。
否则,您可以将
StudentDto
ProfessorDto
设置为“平坦”。例如,您可以将字段
Long professorId
而不是
ProfessorDto professor
添加到
StudentDto
,或将
列出studentId
添加到
ProfessorDto

使用Mapstruct的示例方法:

  • 将DTO类更改为如下所示:

    @JsonApiResource(type = "student")
    @NoArgsConstructor
    @Data
    public class StudentDto {
    
        @JsonApiId
        private Long id;
    
        private String studentName;
    
        private Long professorId; // <-- CHANGED 
    }
    
  • @JsonApiResource(type = "student")
    @NoArgsConstructor
    @Data
    public class StudentDto {
    
        @JsonApiId
        private Long id;
    
        private String studentName;
    
        private Long professorId; // <-- CHANGED 
    }
    
    @Component
    public class MapperHelper {
        @AfterMapping
        public void mapProfessorId(Student student, @MappingTarget StudentDto studentDto) {
            studentDto.setProfessorId(student.getProfessor().getId());
        }
    }