Я использую Traverson для навигации родительских и дочерних отношений по счетам и товарам. Я могу получить ресурсы> и перебрать их, чтобы получить отдельный ресурс и счет-фактуру, используя цикл for ... each. Я хочу повторно использовать объект Traverson, чтобы получить предметы для счета, но Traverson не хочет сотрудничать со мной (пока).
Я посмотрел на вопрос Как получить доступ к одному элементу коллекции REST по ссылкам HATEOAS? и https://docs.spring.io/spring-hateoas/docs/0.25.0.RELEASE/reference/html/#client.traverson,, который близок к тому, чтобы дать мне ответ, но я надеюсь, для более конкретного примера.
String url = baseUrl + invoicesUrl;
Traverson traverson = new Traverson (new URI (url), MediaTypes.HAL_JSON);
ParameterizedTypeReference<Resources<Resource<Invoice>>> invoiceTypeReference =
new ParameterizedTypeReference<Resources<Resource<Invoice>>> () {};
Resources<Resource<Invoice>> invoiceResources =
traverson.follow ("last").toObject (invoiceTypeReference);
ParameterizedTypeReference<Resources<Resource<Item>>> itemTypeReference =
new ParameterizedTypeReference<Resources<Resource<Item>>> () {};
for (Resource<Invoice> invoiceResource : invoiceResources) {
Resources<Resource<Item>> itemResources =
traverson.follow (invoiceResource.getLink ("items").getRel())
.toObject(itemTypeReference); // fails to find the link
}
Получение ресурсов счета-фактуры работает нормально и возвращает
{"_embedded":
{"invoiceList":
[{"sourceLastModified":"2019-03-06T22:33:46.000+0000",
"lastModified":"2019-03-06T22:33:46.000+0000",
"validFrom":"2019-03-06T22:33:46.000+0000",
"validTo":"9999-12-31T06:00:00.000+0000",
"etlStageTagId":null,
"etlCrTagId":77,
"etlErrorInd":null,
"uniqueRowId":35,
"openRowInd":"Y",
"id":35,
"seqNum":1,
"fileId":null,
"fileName":null,
"invoiceNumber":"1",
"invoiceDate":"2019-01-18T06:00:00.000+0000",
"invoiceTotal":0.00,
"companyName":"TEST1",
"approvedBy":null,
"approvedOn":null,
"_links":
{"self":{"href":"https://mydomain/myService/invoices/35"},
"invoices":{"href":"https://mydomain/myService/invoices"},
"items": {"href":"https://mydomain/myService/items/invoice/1/company/TEST1"},
"approve":{"href":"https://mydomain/myService/invoices/1/TEST1/approve/appName"
}
}
},
{"sourceLastModified":"2019-03-06T22:33:46.000+0000",
"lastModified":"2019-03-06T22:33:46.000+0000",
"validFrom":"2019-03-06T22:33:46.000+0000",
"validTo":"9999-12-31T06:00:00.000+0000",
"etlStageTagId":null,
"etlCrTagId":77,
"etlErrorInd":null,
"uniqueRowId":36,
"openRowInd":"Y",
"id":36,
"seqNum":1,
"fileId":null,
"fileName":null,
"invoiceNumber":"1",
"invoiceDate":"2019-01-18T06:00:00.000+0000",
"invoiceTotal":-2025.10,
"companyName":"TEST2",
"approvedBy":null,
"approvedOn":null,
"_links":
{"self":{"href":"https://mydomain/myService/invoices/36"},
"invoices":{"href":"https://mydomain/myService/invoices"},
"items":{"href":"https://mydomain/myService/items/invoice/1/company/TEST2"},
"approve":{"href":"https://mydomain/myService/invoices/1/TEST2/approve/appName"
}
}
}]
},
"_links":{"self":{"href":"https://mydomain/myService/invoices"},
"last":{"href":"https://mydomain/myService/invoices/last"
}
}
}
Я ожидаю, что этот код найдет ссылку в ресурсе счета, чтобы получить элементы и выполнить вызов HTTP GET. Вместо этого я получаю сообщение об ошибке "java.lang.IllegalStateException: ожидается, что в ответ будет найдена ссылка с rel 'items'".
Как заставить объект Traverson переходить по ссылке внутри ресурса, который я извлек в цикле for ... each?