Я использую версию весенней загрузки 2.0.6
, которая поставляется с версией HATEOAS 0.25
.Я использую ассемблер ресурсов, который использует ControllerLinkBuilder
для генерации ссылок на ресурсы.Однако проблема заключается в том, что он генерирует относительные ссылки, как настроить его для использования схем host
и port
из заголовков запросов (приложение будет работать как контейнер Docker в dev, qa и prod) или свойств конфигурации при запускеэто локально из IDE.
Я получаю ссылку, соответствующую X-Forwarded-Host
header
"_links": {
"self": {
"href": "http://something.io/data/api/customers"
}
}
, если я явно добавлю заголовок X-Forwarded-Host
и сгенерирую собственную ссылку с этим кодом
Link self = new Link(
ServletUriComponentsBuilder.fromRequestUri(request).buildAndExpand(pageable).toUri().toString(),
"self");
Нокогда в ассемблере ресурсов я использую обычные linkTo
вызовы от ControllerLinkBuilder
, хост и порт не отображаются в ссылке.
"_links": {
"self": {
"href": "/customers/1"
},
"customers": {
"href": "/customers"
},
"contact": {
"href": "/customers/1/contact"
}
}
Определение контроллера
@Slf4j
@RestController
@RequestMapping("/customers")
@ExposesResourceFor(Customer.class)
public class CustomerController {
}
иметод get
@GetMapping(produces = MediaTypes.HAL_JSON_VALUE)
public DeferredResult<ResponseEntity<Resources<Resource<Customer>>>> getAllCustomers(
@PageableDefault(page = 0, size = 20, sort = "name", direction = Direction.ASC) Pageable pageable,
PagedResourcesAssembler<Customer> assembler, HttpServletRequest request) {
}
Я передаю объект запроса здесь, потому что linkTo
дает URL без хоста и порта
И я использую ассемблер Customer Resource изкод здесь , примеры пружинных hateoas, которые автоматически подключаются к этому контроллеру
@Autowired
private CustomerResourceAssember customerResourceAssembler;
, и так я называю ассемблер ассемблированных ресурсов
assembler.toResource(result, customerResourceAssembler, self)