我正在尝试学习如何使用 Jersey 在 Java 中编写 RESTful 应用程序,并且 hibernate ,我正在努力了解如何处理父/子类型 将数据发布到资源时的关系。我正在使用 JSON 进行交换 数据,但我不认为这与我的问题特别相关。
我正在使用的示例模拟了员工和员工之间的关系 团队。一名员工可能是也可能不是一个团队的成员:
GET /team/ - returns a list of teams
POST /team/ - creates a new team
GET /team/1 - returns a list of employees in the team with the ID 1
GET /employee/ - returns a list of employees
POST /employee/ - creates a new employee
GET /employee/1 - returns details about the employee with the ID 1
在这之后,我有一些 Hibernate 注释的 POJO:一个用于团队,一个 对于员工,两者之间是 1-N 关系(记住 员工可能不是团队成员!)。同样的POJO也有注解 作为@XmlRootElements 以便 JAXB 允许我将它们传递到/从 作为 JSON 的客户端。
这两个实体的属性如下所示:
Team
Long id;
String name;
String desc;
List<Employee> employees;
Employee
Long id;
Team team;
String name;
String phone;
String email;
到目前为止一切都很好。但我正在努力理解如何成为一名员工 在创建时通过传递团队 ID 成为团队成员,而不是 而不是在我的 JSON 对象中传递嵌套的团队对象。
例如,我希望能够使用 JSON 调用 POST/employee/ 看起来像这样:
{
"team_id":"1",
"name":"Fred Bloggs",
"phone":"1234567890",
"email":"test@example.com"
}
但是,相反,我必须传递这样的东西:
{
"team":{
"id":"1",
}
"name":"Fred Bloggs",
"phone":"1234567890",
"email":"test@example.com"
}
所以,我的问题是,其他人如何在不传递整个对象图的情况下处理在 JSON/REST 中创建关系?
抱歉,这是一个粗略的问题,但正如我所说,我才刚刚开始 出来,在这个阶段术语对我来说是个问题!
最佳答案
如果您的框架强制您的表示包含奇怪的结构,例如 { "id":"1"}
那么我认为是时候切换框架了!
更重要的是,与其担心将子 JSONObject 添加到您的代码中,不如担心术语“1”确实不是真正的超链接。如果需要,请阅读超媒体约束或 HATEOAS。
你想在你的 POST 中传递的是这样的:
{
"team_href" : "/teams/1",
"name":"can'tbebothered"
}
所以当服务器看到这个时,它会将新创建的员工与团队 #1 链接起来,仅仅是因为它识别(相对)URI。
关于java - RESTful 1-N 可选关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3534669/