【发布时间】:2015-10-26 17:55:24
【问题描述】:
我正在评估 Spring Data REST 作为基于 AngularJS 的应用程序的后端。我很快将我们的域建模为一组聚合根,并遇到了以下设计障碍:
- 模型资源有
- 多个任务实体
- 引用多个属性资源
我希望 HAL _links 用于将属性放置在每个任务 JSON 对象中,但遗憾的是,这些属性仅作为 JSON 结构根部的链接可见。
例如我明白了:
{
"version": 0,
"name": "myModel",
"tasks": [
{
"name": "task1"
},
{
"name": "task2"
}
],
"_links": {
"self": {
"href": "http://localhost:8080/models/1"
},
"attributes": {
"href": "http://localhost:8080/models/1/attributes"
}
}
}
而不是我想像的东西可能是:
{
"version": 0,
"name": "myModel",
"tasks": [
{
"name": "task1",
"_links": {
"attributes": {
"href": "http://localhost:8080/models/1/tasks/1/attributes"
}
}
},
{
"name": "task2",
"_links": {
"attributes": {
"href": "http://localhost:8080/models/1/tasks/2/attributes"
}
}
],
"_links": {
"self": {
"href": "http://localhost:8080/models/1"
},
"attributes": {
"href": "http://localhost:8080/models/1/attributes"
}
}
}
顺便说一句,在第一个示例中,attributes 链接以 404 结尾。
我在 HAL 规范中没有看到任何处理这种情况的内容,在 Spring Data REST 文档中也没有。显然,我可以将任务定义为解决问题的资源,但是我的模型不需要这样做。我觉得这是一个合法的用例。
我创建了一个简单的 Spring Boot 应用程序来重现此问题。模型:
@Entity
public class Model {
@Id @GeneratedValue public Long id;
@Version public Long version;
public String name;
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
public List<Task> tasks;
}
@Entity
public class Task {
@Id @GeneratedValue public Long id;
public String name;
@ManyToMany
public Set<Attribute> attributes;
}
@Entity
public class Attribute {
@Id @GeneratedValue public Long id;
@Version public Long version;
public String name;
}
和存储库:
@RepositoryRestResource
public interface ModelRepository extends PagingAndSortingRepository<Model, Long> {
}
@RepositoryRestResource
public interface AttributeRepository extends PagingAndSortingRepository<Attribute,Long> {
}
在那里,我可能错过了一些东西,因为这似乎是一个非常简单的用例,但在 SO 上找不到任何有类似问题的人。另外,也许这是我的模型中的一个根本缺陷,如果是这样,我已经准备好听取您的论点:-)
【问题讨论】:
标签: java spring-data-rest hateoas spring-hateoas