当前位置: 首页 > 知识库问答 >
问题:

在B类中使用List属性避免循环问题

卫弘懿
2023-03-14

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

我是Mapstruct的新手,将域bean转换为具有简单属性的Dto,如Long,String正在工作,但在我的示例中,关系OneTo多项不工作!

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

还有一个班的学生

@JsonApiResource(type = "student")
@NoArgsConstructor
@Data
public class StudentDto {

  @JsonApiId
  private Long id;

  private String studentName;

  @JsonApiRelation
  private ProfessorDto professor;
}

我给教授的地图是

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

共有2个答案

于正志
2023-03-14

首先,您应该决定是否真的需要保留列表

使用Mapstruct的示例方法:

>

  • 像这样更改一个DTO类:

    @JsonApiResource(type = "student")
    @NoArgsConstructor
    @Data
    public class StudentDto {
    
        @JsonApiId
        private Long id;
    
        private String studentName;
    
        private Long professorId; // <-- CHANGED 
    }
    

    添加Helper类,并提供自定义映射逻辑:

    @Component
    public class MapperHelper {
        @AfterMapping
        public void mapProfessorId(Student student, @MappingTarget StudentDto studentDto) {
            studentDto.setProfessorId(student.getProfessor().getId());
        }
    }
    

  • 蒋典
    2023-03-14

    使用@Context注释查看此示例

    https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-mapping-with-cycles/src/main/java/org/mapstruct/example/mapper

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

    https://mapstruct.org/documentation/stable/api/org/mapstruct/Context.html

     类似资料:
    • 从我的main开始,我将启动两个线程,称为producer和consumer。两者都包含循环。生产者循环是UDP服务器,因此不需要Hibernate。我的问题出在消费者方面。使用者循环将对象从链接队列中移除,并将其传递给一个函数进行进一步处理。根据研究,在循环中使用线程Hibernate不是一个好的实践,因为有时O/S在设定时间结束时不会释放。如果我删除线程Hibernate,当应用程序是理想的,

    • 问题内容: 我们都知道您由于以下原因而无法执行以下操作: 但这显然有时有效,但并非总是如此。这是一些特定的代码: 当然,这导致: 即使没有多个线程。无论如何。 解决此问题的最佳方法是什么?如何在不引发此异常的情况下循环地从集合中删除项目? 我还在这里使用任意值,不一定是an t,因此您不能依赖。 问题答案: 是安全的,您可以这样使用它: 注意,这是在迭代过程中修改集合的唯一安全方法。如果在进行迭代

    • 我有一个用Grails 2.3.8编写的大项目。有时,当我使用我的CI部署它时,我收到以下消息: 由于StackOverflow Error,无法完成Web应用程序[/ProjectName##1152]的注释扫描。 可能的根本原因包括 -Xss 设置过低和非法的循环继承依赖关系。正在处理的类层次结构是 [org.bouncycastle.asn1.ASN1EncodableVector- 我已经

    • 考虑这两个模块(在同一个文件夹中): 首先是人。派克 然后pet.py 上面的代码将无法工作,因为循环依赖。你会得到一个错误: 让它工作的一些方法: 将类Person和Pet的定义保存在同一个文件中 e、 g.只要有: 到目前为止,我在列出的所有选项中看到了一些缺点。 还有别的办法吗?一个允许我 将类拆分为不同的文件 或者:有没有很好的理由去遵循我已经列出的解决方案之一?

    • 问题内容: 我尝试使用MVP范例构建Webapp。因为我希望API干净并且使所有内容易于测试,所以我尝试通过Contructor Injection注入所有可能的内容。现在,我到了一个具有多个文本字段的视图。当数据库中有值时,演示者将填充这些文本字段,因此我的演示者需要视图的引用,但是vie显然也需要演示者的引用。CDI告诉我,由于循环依赖性,无法将Presenter注入视图。是否有可能避免通过s

    • 问题内容: 如何避免使用HttpClient 4.1.1进行循环重定向。当我得到这样的错误:- 这是我的代码… 问题答案: 您可以将ClientPNames.ALLOW_CIRCULAR_REDIRECTS设置为true,这将允许重定向到同一位置。 在这里查看更多信息