Как мне заставить Траверсона найти ссылку в Ресурсе в Ресурсах? - PullRequest
0 голосов
/ 27 марта 2019

Я использую 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?

...