如何使用Spring Boot Rest API获取关系数据?

问题描述

我正在使用Spring Boot构建REST API来检索船只信息。我正在使用 Spring Data Rest 和Spring Data JPA。当我从API获取数据时,我不知道为什么关系数据与其他信息不一样。

我必须在Spring中进行一些配置以获取与数据的关系吗?

这是我的文件。

船体:

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

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

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

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "type_id",nullable = false)
    @JsonBackReference
    private BoatType type;

}

船型实体:

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

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

    @OneToMany(cascade = CascadeType.ALL,mappedBy = "type")
    @JsonManagedReference
    private Set<Boat> boats;

}

船库:

@CrossOrigin("http://localhost:4200")
public interface BoatRepository extends JpaRepository<Boat,Long> {
}

JSON响应:

{
"_embedded": {
  "boats": [
    {
      "id": 1,"name": "Boat 1","description": "A brief description of the boat 1","_links": {
        "self": {
          "href": "http://localhost:8080/api/boats/1"
        },"boat": {
          "href": "http://localhost:8080/api/boats/1"
        },"type": {
          "href": "http://localhost:8080/api/boats/1/type"
        }
      }
    },...
  ]

}

预期结果(也带有类型对象)

{
"_embedded": {
  "boats": [
    {
      "id": 1,"type": {
          "id": 1,"name": "Motorboats"
      },...
  ]

}

我认为问题与Spring Data Rest有关,因为当我使用自己的控制器和存储库执行相同的应用程序时,我会获得所需的数据。

有没有一种方法可以“配置” spring数据表?

解决方法

似乎您已经使用@JsonBackReference@JsonManagedReference了,而不是您需要的。您已将@JsonBackReference放在type类的Boat字段中,而its documentation指出:

[...]链接的处理方式使得带有该注释的属性未序列化

因此,似乎您需要在其上放置@JsonManagedReference注释(请参阅:JsonManagedReference documentation),并在@JsonBackReference类的boats上放置BoatType

或者,您可以考虑改为使用@JsonIdentityInfo。参见:the documentation

此外,this article可能会有所帮助。它解释了使用Jackson来处理双向关系的各种方法。

,

@JsonManagedReference@JsonBackReference更改为@JsonIgnoreProperties

在您的情况下:

@OneToMany(cascade = CascadeType.ALL,mappedBy = "type")
@JsonIgnoreProperties(value = {"type"})
private Set<Boat> boats;

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "type_id",nullable = false)
@JsonIgnoreProperties(value = {"boats"})
private BoatType type;

您将避免在json结果中出现无限循环,并获取所有引用对象(关系)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...