我有一个运行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;
...
}
现在,显然每个小组都可以将人员作为成员,这可以通过@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
添加成员到{{1}但是我必须通过发布到/groupMembers/
来创建一个新的GroupMember实体,这就是imho,不再那么舒服了,打破了群组REST'树'的凝聚力。
如何解决这个问题并允许简单的POST创建一个(基本的)GroupMember,默认值为?当然我可以在那里放一个新的@RepositoryRestController来捕获/groups/1/members
的任何POST请求,但这会阻止text / uri-list列表(因为它似乎不支持)。我可以定义一个新对象,例如使用人员ID,但这会破坏流程,简单发布链接列表会更好。
另一种方法是找到一种方法来映射Hibernate @ManyToMany本身而不需要额外的实体......但我不知道这样的方式......
答案 0 :(得分:2)
如果您正在处理spring数据休息并希望在自定义控制器中处理text/uri-list
,则可以使用类型为Resources
的参数传递值:
@RequestBody Resources<Object> incoming
您可以致电incoming.getLinks()
您可以将弹簧数据休息控制器视为参考 - org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference
答案 1 :(得分:0)
我认为你最好有第三个实体,GroupMember
如你所提议的那样。你还不能公开一个允许你发帖到/groups/1/members
的API端点吗?为了做到这一点,您似乎需要在控制器中使用业务逻辑来解析相应的Person并构造GroupMember实例。在我看来,这是这个业务逻辑的适当位置。