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

在spring中使用多对一映射时获得无限Json响应[duplicate]

洪捷
2023-03-14

我试图在Spring创建两个实体之间的多对一映射。然而,当我尝试使用restController获取值时,我得到了

JAVAlang.IllegalStateException:在提交响应后无法调用sendError()

错误和无限JSON响应。添加JSON ignore解决了这个问题,但我的回复中根本没有这个列。我不知道怎么解决这个问题。请帮忙。提前谢谢。

以下是我的实体:

@Entity
@Table(name="tbl1")
public class Data {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "customer")
    private String customer;



    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="data_id", insertable = true, nullable = false, updatable = false)
    private DataList dataList1;

}

@Entity
@Table(name="tbl2")
public class DataList {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="data_id")
    private Long dataId;



    @Column(name="user_name")
    private String userName;



    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER,mappedBy = "dataList1")
    private List<Data> data1;


}

存储库:

@Repository
@Transactional
public interface DataList extends JpaRepository<DataList,Long> {
}
@Repository
@Transactional
public interface Data extends JpaRepository<Data,Long> {
}

我的错误:Java。lang.IllegalStateException:在提交响应后无法调用sendError()

共有3个答案

党宇定
2023-03-14
  1. 渴望是一种糟糕的做法。使用LAZY,当需要相关实体时,使用fetch-join-query

您可能认为将一些模型映射到另一个模型是极其无聊的。但在这里以另一种方式。Hibernate实体不应该传递给前端。我的应用程序使用几种类型的对象:Entities(当从DB获取时)、DTO(当将实体映射到DTO并给出它们的服务内组件时)、Shared(当将DTO映射到Shared并作为对我的微服务之间的控制器的响应共享时)和Model(当从响应映射到模型并给出模板引擎时,例如freemarker)。您可能不需要这种模型层次结构。

创建DTO:

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class DataListDto {

    private Long dataId;
    private String userName;

    private List<DataDto> data1;


}

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class DataDto {

    private long id;
    private String customer;

}

写下你的地图:

 public class DataListMapper {

    public static DataListDto mapToDto(DataList dataList) {
        return new DataListDto(dataList.getDataId(), dataList.getUserName(), dataList.getData1().stream().map(x -> DataListMapper.mapToDto(x).collect(Collectors.toList)))
    }

    public static DataDto mapToDto(Data data) {
        return new DataDto(data.getId(), data.getCustomer());
    }
}

您的服务:

public class DataListService {
            @Autowired
            private DataListRepository dataListRepository;


            public List<DataListDto> getAllData() {
                List<DataList> dataLists = this.dataListRepository.findAll();
                return dataLists.stream().map(x->DataListMapper.mapToDto(x)).collect(Collectors.toList());
            }
        }
於意蕴
2023-03-14

当JSON序列化程序试图一次又一次地递归序列化这两个实体时,就会发生这种情况。

因此,在序列化数据时,其成员dataList1属于DataList类型,该类型进一步包含List

理想情况下,在这种情况下,实体应该映射到用于序列化和响应的其他模型,或者其中一个模型需要是@JsonIgnore,以避免这种递归循环。

拓拔嘉颖
2023-03-14

1)一般来说,将fetch=FetchType。EAGER放在@OneTo众多上不是明智的做法。尝试将其设置为LAZY。

2) 确保数据和数据列表实体正确地实现了equals()hashCode()方法

 类似资料:
  • 将返回响应的控制器类的代码: 下面是具有一对一映射的两个实体类。 我得到的回应是: 如上面的响应所示,我只得到json值,我的意思是只得到没有列名的表值。因此,如何将json响应映射到响应协同响应键上。

  • 参考此Hibernate文档后 在我的情况下,将“Person”替换为“Employee”,将“Phone”替换为“Company”,将“Person\u Phone”替换为“EmployeeCompany”。 以上Hibernate docs示例和my project示例的唯一区别是黑白。在Hibernate文档示例“Person\u Phone”中,将“phones\u Id”作为唯一约束。而

  • 我正在尝试将从远程服务获得的响应映射到对象中。对于客户端,我使用的是 JAX-RS 注释接口: 响应采用以下格式,作为对象的JSON列表: 我试图映射到的类是: 它总是返回一个带有空项目列表的项目实例。有什么想法吗? 更新 将其更改为: 返回

  • 有两张数据表,其中A表的某个字段的值指向B表的主键。因为B表的任何一条记录理论上可以对应A表的多条记录,所以称这种 映射为B表对A表数据的一对多映射。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图,一个 Master 自然就能对应多个 Pet ,所以, Master.pets (一个 List<Pet>) 就可以指向多个 Pet 对象, 那么我们说 Master.pets 就是

  • 我收到http请求的响应,格式如下: 当我执行下面的代码时,我想将其映射到DTO中: DTO类别: 另一个类是: 当我尝试将FinalTestDt中的响应映射到类时,它会引发一个异常: WARN:org.springframework.http.converter.json.MappingJackson2HttpMessageConzer-无法评估类型[简单类型,类FinalTestDTO]的反序

  • 在进行web客户端调用并使用前一个Mono的响应后,我无法在映射中获得填充值。以下是我所尝试的代码。parameters.size()的值为零。无法获得该值未被文件化的原因。我基本上希望从该方法返回年龄(而不是单对象)。使用block给出一个错误block()/blockfirst()/blocklast()是blocking,这在thread Reactor-http-nio-3中是不支持的。