我有一个简单的项目运行 Spring-Data-Rest 来通过 Rest API 公开一些实体,就像这个(简化,减去 Setters/Getters):
@Entity
public class Group {
@Id
@GeneratedValue
private int id;
...
}
@Entity
public class Person{
@Id
@GeneratedValue
private int id;
...
}
现在,显然每个组都可以拥有 Persons 作为成员,这可以通过
@ManyToMany
轻松解决。不幸的是(或通常?)组成员资格包含的信息不仅仅是“是成员”。例如,它还应包括“是...的管理员”或“是...的隐藏成员”的信息。这自然会导致一个额外的实体......
@Entity
public class GroupMember {
@OneToOne(optional = false)
@JoinColumn(updatable = false)
private Person member;
@OneToOne(optional = false)
@JoinColumn(updatable = false)
private Group group;
private boolean admin;
private boolean hidden;
...
}
这不会那么糟糕,但不幸的是导致了一个问题......我不能再简单地通过
POST
将 text/uri-list
添加到组中(例如) /groups/1/members
,但我必须通过发布来创建一个新的 GroupMember 实体到 /groupMembers/
,恕我直言,不再那么舒服并且破坏了 Group REST“树”的凝聚力。我该如何解决这个问题,并允许一个简单的 POST 使用默认值创建一个(基本)GroupMember?当然,我可以在那里放置一个新的 @RepositoryRestController 来捕获对
/groups/1/members
的任何 POST 请求,但这会阻止 text/uri-list 列表(因为它似乎不支持)。我可以定义一个新对象,例如一个人的 id,但这会打破流程,简单地发布一个链接列表会更好。另一种方法是找到一种方法来映射 Hibernate @ManyToMany 本身而不需要额外的实体......但我不知道这样的方式......
最佳答案
如果您正在使用 spring 数据休息并希望在自定义 Controller 中处理 text/uri-list
,您可以使用 Resources
类型的参数传递值,如下所示:
@RequestBody Resources<Object> incoming
您通过调用
incoming.getLinks()
获取 uri可以引用spring data rest controller -
org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference