如何解决如何使用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结果中出现无限循环,并获取所有引用对象(关系)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。