Spring WebFlux の WebClient でクライアント ライブラリを作成しようとしています。
サーバーは次の JSON のような応答を返します。
{
"result": [
{
"parent": "",
"made_sla": "true",
"watch_list": "",
"upon_reject": "cancel",
"sys_updated_on": "2016-01-19 04:52:04",
"approval_history": "",
"number": "PRB0000050",
"sys_updated_by": "glide.maint",
"opened_by": {
"link": "https://instance.service-now.com/api/now/table/sys_user/glide.maint",
"value": "glide.maint"
},
"user_input": "",
"sys_created_on": "2016-01-19 04:51:19",
"sys_domain": {
"link": "https://instance.service-now.com/api/now/table/sys_user_group/global",
"value": "global"
},
"state": "4",
"sys_created_by": "glide.maint",
"knowledge": "false",
"order": "",
"closed_at": "2016-01-19 04:52:04",
"cmdb_ci": {
"link": "https://instance.service-now.com/api/now/table/cmdb_ci/55b35562c0a8010e01cff22378e0aea9",
"value": "55b35562c0a8010e01cff22378e0aea9"
},
"delivery_plan": "",
"impact": "3",
"active": "false",
"work_notes_list": "",
"business_service": "",
"priority": "4",
"sys_domain_path": "/",
"time_worked": "",
"expected_start": "",
"rejection_goto": "",
"opened_at": "2016-01-19 04:49:47",
"business_duration": "1970-01-01 00:00:00",
"group_list": "",
"work_end": "",
"approval_set": "",
"wf_activity": "",
"work_notes": "",
"short_description": "Switch occasionally drops connections",
"correlation_display": "",
"delivery_task": "",
"work_start": "",
"assignment_group": "",
"additional_assignee_list": "",
"description": "Switch occasionally drops connections",
"calendar_duration": "1970-01-01 00:02:17",
"close_notes": "updated firmware",
"sys_class_name": "problem",
"closed_by": "",
"follow_up": "",
"sys_id": "04ce72c9c0a8016600b5b7f75ac67b5b",
"contact_type": "phone",
"urgency": "3",
"company": "",
"reassignment_count": "",
"activity_due": "",
"assigned_to": "",
"comments": "",
"approval": "not requested",
"sla_due": "",
"comments_and_work_notes": "",
"due_date": "",
"sys_mod_count": "1",
"sys_tags": "",
"escalation": "0",
"upon_approval": "proceed",
"correlation_id": "",
"location": ""
},
{
"parent": "",
"made_sla": "true",
"watch_list": "",
"upon_reject": "cancel",
"sys_updated_on": "2016-01-19 04:52:04",
"approval_history": "",
"number": "PRB0000050",
"sys_updated_by": "glide.maint",
"opened_by": {
"link": "https://instance.service-now.com/api/now/table/sys_user/glide.maint",
"value": "glide.maint"
},
"user_input": "",
"sys_created_on": "2016-01-19 04:51:19",
"sys_domain": {
"link": "https://instance.service-now.com/api/now/table/sys_user_group/global",
"value": "global"
},
"state": "4",
"sys_created_by": "glide.maint",
"knowledge": "false",
"order": "",
"closed_at": "2016-01-19 04:52:04",
"cmdb_ci": {
"link": "https://instance.service-now.com/api/now/table/cmdb_ci/55b35562c0a8010e01cff22378e0aea9",
"value": "55b35562c0a8010e01cff22378e0aea9"
},
"delivery_plan": "",
"impact": "3",
"active": "false",
"work_notes_list": "",
"business_service": "",
"priority": "4",
"sys_domain_path": "/",
"time_worked": "",
"expected_start": "",
"rejection_goto": "",
"opened_at": "2016-01-19 04:49:47",
"business_duration": "1970-01-01 00:00:00",
"group_list": "",
"work_end": "",
"approval_set": "",
"wf_activity": "",
"work_notes": "",
"short_description": "Switch occasionally drops connections",
"correlation_display": "",
"delivery_task": "",
"work_start": "",
"assignment_group": "",
"additional_assignee_list": "",
"description": "Switch occasionally drops connections",
"calendar_duration": "1970-01-01 00:02:17",
"close_notes": "updated firmware",
"sys_class_name": "problem",
"closed_by": "",
"follow_up": "",
"sys_id": "04ce72c9c0a8016600b5b7f75ac67b5b",
"contact_type": "phone",
"urgency": "3",
"company": "",
"reassignment_count": "",
"activity_due": "",
"assigned_to": "",
"comments": "",
"approval": "not requested",
"sla_due": "",
"comments_and_work_notes": "",
"due_date": "",
"sys_mod_count": "1",
"sys_tags": "",
"escalation": "0",
"upon_approval": "proceed",
"correlation_id": "",
"location": ""
},
{
"parent": "",
"made_sla": "true",
"watch_list": "",
"upon_reject": "cancel",
"sys_updated_on": "2016-01-19 04:52:04",
"approval_history": "",
"number": "PRB0000050",
"sys_updated_by": "glide.maint",
"opened_by": {
"link": "https://instance.service-now.com/api/now/table/sys_user/glide.maint",
"value": "glide.maint"
},
"user_input": "",
"sys_created_on": "2016-01-19 04:51:19",
"sys_domain": {
"link": "https://instance.service-now.com/api/now/table/sys_user_group/global",
"value": "global"
},
"state": "4",
"sys_created_by": "glide.maint",
"knowledge": "false",
"order": "",
"closed_at": "2016-01-19 04:52:04",
"cmdb_ci": {
"link": "https://instance.service-now.com/api/now/table/cmdb_ci/55b35562c0a8010e01cff22378e0aea9",
"value": "55b35562c0a8010e01cff22378e0aea9"
},
"delivery_plan": "",
"impact": "3",
"active": "false",
"work_notes_list": "",
"business_service": "",
"priority": "4",
"sys_domain_path": "/",
"time_worked": "",
"expected_start": "",
"rejection_goto": "",
"opened_at": "2016-01-19 04:49:47",
"business_duration": "1970-01-01 00:00:00",
"group_list": "",
"work_end": "",
"approval_set": "",
"wf_activity": "",
"work_notes": "",
"short_description": "Switch occasionally drops connections",
"correlation_display": "",
"delivery_task": "",
"work_start": "",
"assignment_group": "",
"additional_assignee_list": "",
"description": "Switch occasionally drops connections",
"calendar_duration": "1970-01-01 00:02:17",
"close_notes": "updated firmware",
"sys_class_name": "problem",
"closed_by": "",
"follow_up": "",
"sys_id": "04ce72c9c0a8016600b5b7f75ac67b5b",
"contact_type": "phone",
"urgency": "3",
"company": "",
"reassignment_count": "",
"activity_due": "",
"assigned_to": "",
"comments": "",
"approval": "not requested",
"sla_due": "",
"comments_and_work_notes": "",
"due_date": "",
"sys_mod_count": "1",
"sys_tags": "",
"escalation": "0",
"upon_approval": "proceed",
"correlation_id": "",
"location": ""
}
]
}
結果フィールドには要素の配列が含まれ、その要素は使用される API によって異なる場合があります。
その API の詳細については、ServiceNow 製品のテーブル APIを参照してください。
ドキュメントでわかるように、API パスは次のようなものです: GET /now/table/{tableName}。ここで、tableName は異なる値である可能性があり、結果要素のヒントはフェッチされたテーブルによって異なります。
したがって、結果フィールド内の応答要素は、異なる名前または異なる量の属性で形成できます。基本的に、これは HTTP を介して公開されるデータベースであるため、すべてのテーブルを異なる数の列で形成できます。
私のGET実装:
public Mono<Result> get(){
return client.get()
.uri(uriBuilder -> uriBuilder
.path(this.tablePath)
.queryParam("active", "true")
.queryParam("state", "1")
.build())
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(Result.class);
}
POJO
@Data
public class ProjectTask {
private String project;
}
@Data
public class Result <T> {
List<T> result;
}
エラーを取得する簡単な使用法:
List<ProjectTask> projectTasks = Objects.requireNonNull(
client.table("pm_project_task")
.get().block())
.getResult();
for (ProjectTask task : projectTasks){
System.out.println("========PROJECT=============== "+task.getProject());
}
行の実行時エラーfor (ProjectTask task : projectTasks){
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to my.namespace.api.services.servicenow.model.ProjectTask
対応の必要性:
- 結果 POJO は、ジェネリック タイプを使用して、さまざまな応答要素タイプを管理する必要があります。
- 最初のポイントを達成できない場合は、さまざまなテーブル タイプに対して再利用可能な GET 実装を使用して、その API をフェッチするソリューションを提供してみてください。
- クライアントから List を返したくありません。私の考えでは、このライブラリは Mono または Flux オブジェクトのみを返します。