Почему resource.getId(). Expand() завершится ошибкой из-за ошибки "Недостаточно значений переменных, доступных для раскрытия" id ""?
Я пишу основанный на REST веб-сервис, используя Spring и HATEOAS. Одним из моих объектов-сущностей является Invoice, и у моего контроллера есть метод newInvoice, который работает до тех пор, пока он не попытается сгенерировать ResponseEntity; в этот момент метод resource.getId().expand() завершается с ошибкой, java.lang.IllegalArgumentException: Not enough variable values available to expand 'id'
,
Я посмотрел на /questions/15395152/ispolzovanie-resttemplate-vesnoj-isklyuchenie-nedostatochno-peremennyih-dlya-rasshireniya, но это относится к тому, кто использует RestTemplate для вызова сервиса, а не сам код сервиса.
Я следовал руководству Spring при построении REST-сервисов с помощью Spring, и он работал хорошо для меня, пока я не попытался создать свой метод newInvoice, который должен позволить мне создать счет из моего тестового кода, который затем будет прочитан позже в тесте. код.
Соответствующий блок кода, который вызывает у меня проблемы:
Invoice invoice = repository.save (newInvoice);
System.out.println ("Saved new invoice: " + invoice);
Resource<Invoice> resource = assembler.toResource (invoice);
System.out.println ("Created resource: " + resource);
return ResponseEntity
.created (new URI (resource.getId().expand ().getHref()))
.body (resource);
Первый println показывает сохраненный счет-фактуру с действительным значением идентификатора (последний раз, 30). В частности,
Saved new invoice: Invoice (id=30, invoiceDate=2019-01-17, invoiceNumber=1005, invoiceTotal=125.00)
Тем не менее, второй println показывает, что идентификатор не заполняется в ссылках внутри ресурса:
Created resource: Resource { content: Invoice (id=30, invoiceDate=2019-01-17, invoiceNumber=1005, invoiceTotal=125.00), links: [</invoices/{id}>;rel="self", </invoices>;rel="invoices", </claims?invoice={invoiceNumber}>;rel="claims", </invoices/{number}/{company}/approve?a={approver}>;rel="approve"] }
Я знаю, что это вызывает ошибку, но я не уверен, почему. Обратите внимание, что используемый ассемблер прекрасно работает, когда я читаю из базы данных, не пытаясь выполнить repository.save().