Sprind data jpa - 如何处理客户端发布的选择性字段以休息Web服务

时间:2018-03-19 10:48:14

标签: spring rest spring-data-jpa

我正在使用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

}

2 个答案:

答案 0 :(得分:0)

您可以将域划分为子域,例如

Device包含(deviceNo)和DeviceMaster(deviceMasterType) 适用于roleMaster的RoleStatusCountry,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响应将无法为客户提供信息。