我正在使用jpa处理Spring数据休息的请求。我有一个域类说用户,在这个域类中有很多字段和映射。当客户端想要更新用户数据时,他们必须按照域类提交整个json主体。想要处理它,以便客户端可以通过仅发送选择性字段来更新用户信息。这样做的最佳方法是什么,请建议。 示例JSON OBJECT映射到用户域类:
{
"id": 1,
"oauthClientDetails": {
"clientId": "8909241111",
"resourceIds": null,
"clientSecret": "secret",
"scope": "read",
"authorizedGrantTypes": "client_credentials",
"webServerRedirectUri": null,
"authorities": null,
"accessTokenValidity": 18000,
"refreshTokenValidity": null,
"additionalInformation": "{}",
"autoApprove": null
},
"deviceNo": "SMR01-4417-0002",
"deviceMasterType": {
"id": 1,
"name": "Single Phase",
"description": "Single phase meter",
"createdDate": "21-02-2018 10:11:03",
"updatedDate": "24-02-2018 10:11:03",
"statusMaster": {
"id": 2,
"name": "Active",
"createdDate": "21-02-2018 10:11:03",
"updatedDate": "21-02-2018 10:11:05",
"status": "1"
}
},
"societyName": "M G ROad",
"flatNo": "51",
"firstName": "rohit",
"lastName": "yadav",
"roleMaster": {
"id": 1,
"name": "Super user",
"description": "This role provides all application permissions.",
"createdDate": "23-02-2018 10:15:05",
"updatedDate": "23-02-2018 10:15:05",
"statusMaster": {
"id": 1,
"name": "De-Active",
"createdDate": "21-02-2018 10:11:03",
"updatedDate": "21-02-2018 10:11:05",
"status": "1"
}
},
"statusMaster": {
"id": 2,
"name": "Active",
"createdDate": "21-02-2018 10:11:03",
"updatedDate": "21-02-2018 10:11:05",
"status": "1"
},
"email": null,
"countryMaster": {
"id": 1,
"countryCode": "BOL",
"countryName": "Bolivia, Plurinational State of",
"callingCode": "591",
"createdDate": "21-02-2018 10:11:05",
"updatedDate": "21-02-2018 10:11:05"
},
"otp": "1234",
"otpVerification": null,
"alternateMobile": "8800488281",
"createdDate": "28-02-2018 11:15:05",
"updatedDate": "02-03-2018 10:15:05",
"clientID": null
}
答案 0 :(得分:0)
您可以将域划分为子域,例如
Device
包含(deviceNo)和DeviceMaster
(deviceMasterType)
适用于roleMaster的Role
,Status
,Country
,statusMaster,countryMaster
使用诸如email,updatedDate等根级元素作为基础域对象的一部分,例如Client
。
然后,您的REST端点可以公开此域结构以允许更新部分信息:
https://api.com/device
https://api.com/deviceMaster
https://api.com/role
https://api.com/status
https://api.com/country
https://api.com/client
并部分更新域名。如果/ device之类的子域只需要更新deviceNo,则在创建域对象时忽略缺少的JSON字段。
答案 1 :(得分:0)
尽管按照@codebrane的建议闯入子域类是个好主意。
但即使您的子域类也可以有选择性字段。
因此,您应首先定义哪些是可选字段和必填字段。 首次检查应该告诉您的客户他们应该发送哪些强制性项目。 您应该使用Bean验证来实现此目标,这是由您使用的任何供应商数据库支持的。
而且,JSON中的所有项目都不太可能依赖,例如,如果没有先保存用户,则无法创建用户的地址或设备信息。 如果你把所有这些都放在一个API中,那么你很难实现单一责任原则,而不是很好。
在这种情况下,您可以先在另一个API调用中保存用户,然后再保存地址等。
将您的依赖实体分离为单独的域对象,这将有助于您相应地设计REST API。
如果您遵循这种方法,那么它也可以帮助您为您的客户提供正确的回复。例如,一个只接受地址并且因任何原因失败的API将通知客户端单个实体失败。如果您在一个API中使用了地址,联系人,设备等,那么在服务器上它们可能会失败或独立传递,而您的API响应将无法为客户提供信息。