【发布时间】:2019-07-22 10:10:35
【问题描述】:
我想用 Spring Boot 和 Spring Data REST 构建一个简单的 HATEOAS API。
因此,我创建了 2 个不同的实体 A 和 B。两者之间存在多对多关系。因为该关系还需要 2 个属性,所以我用这些属性添加了一个新的关系 R。
对于 API,只有 A 和 B 应该是可见的,R 只是内部的并且没有存储库。我想用指向 B 集合的链接来表示 A。
应该可以在不提供和返回 R 的内部属性的情况下创建 A、创建 B、将 A 链接到 B 或 B 到 A。
我猜是设计问题?
可能的解决方案:
我尝试创建一个自定义方法 findByR_Bid() 但我无法为该方法提供自己的 id,因此“/a/b”是不可能的,它始终是“/a/search/...”。
接下来,我添加了一个带有 ResponseEntities.linkToCollection(B.class) 的自定义链接,但这将表示一个指向“/b”的链接,而不引用 A 自己的 id。
接下来,我在 A 中实现了一个从 R 返回 List 的方法。但是这个列表作为属性包含在内部,而不是创建一个 Link。
位码:
@Entity
public class A {
@Id
private Long id;
@OneToMany(mappedBy = "a")
private List<R> r;
// getters
}
@Entity
public class B {
@Id
private Long id;
@OneToMany(mappedBy = "b")
private List<R> r;
// getters
}
@Entity
public class R {
@Id
private Long id;
@ManyToOne(optional = false)
private A a;
@ManyToOne(optional = false)
private B b;
// internal properties
@JsonIgnore
private String foo;
@JsonIgnore
private String bar;
// getters
}
对于 JSON 响应,我想要这样的东西:
获取 /a/1
"_links" : {
"self": {
"href": "http://localhost:8080/a/1"
},
"a": {
"href": "http://localhost:8080/a/1"
},
"bs": {
"href": "http://localhost:8080/a/1/b{?page,size,sort}",
"templated": true
}
}
【问题讨论】:
标签: java spring spring-boot spring-data-rest