【问题标题】:How to get relationship data with spring boot rest api?如何使用spring boot rest api获取关系数据?
【发布时间】:2020-12-05 09:18:42
【问题描述】:

我正在使用 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,
      "name": "Boat 1",
      "description": "A brief description of the boat 1",
      "type": {
          "id": 1,
          "name": "Motorboats"
      },
      "_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"
        }
      }
    },
    ...
  ]

}

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

有没有办法“配置”spring data rest?

【问题讨论】:

  • 尝试删除@JsonBackreferences并使用eger加载
  • 它不会改变结果

标签: json spring spring-boot rest relationship


【解决方案1】:

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

[...] 链接被处理,使得使用此注释注释的属性不序列化

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

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

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

【讨论】:

  • 感谢您的解释。我阅读了相关文章并尝试了所有解决方案,不幸的是没有任何改变......
【解决方案2】:

@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 结果中的无限循环并获取所有引用对象(关系)。

【讨论】:

  • 这个解决方案没有成功:(
  • 但我尝试建立单向关系,但问题仍然存在。所以也许它来自我的 api 的另一部分。我删除了在boat_type 中设置的船,没有结果
  • @JeromeSchneider 你有字段的所有设置器和获取器吗?
  • 我使用为我完成这项工作的 Lombok 库。你认为这与我的问题有关吗?
  • 尝试手动制作setter和getter。然后我们就可以排除一个问题了。
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2020-05-03
  • 2020-09-12
  • 2020-03-22
相关资源
最近更新 更多