Я использую весеннюю загрузочную версию 2.0.6, которая поставляется с версией HATEOAS 0.25. Я использую ассемблер ресурсов, который использует ControllerLinkBuilder для создания ссылок на ресурсы. Однако проблема в том, что он генерирует относительные ссылки, как настроить его для использования схемы host и port из заголовков запросов (приложение будет работать как контейнер докеров в dev, qa и prod) или свойств конфигурации при его локальном запуске из IDE. .
Я получаю ссылку, которая уважает заголовок X-Forwarded-Host
"_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 без хоста и порта
И я использую ассемблер клиентских ресурсов из кода здесь, spring hateoas exmaples, который автоматически подключается к этому контроллеру.
@Autowired
private CustomerResourceAssember customerResourceAssembler;
и так я называю ассемблер страничных ресурсов
assembler.toResource(result, customerResourceAssembler, self)
UriComponentsBuilder в spring-hateoas вызывает RequestContextHolder.getRequestAttributes() для получения атрибутов запроса. Они прикрепляются к потоку сервлетом диспетчера. Поскольку вы используете DeferredResult, вы уже вернули поток с атрибутами запроса. Поток, используемый для построения ссылок, не имеет атрибутов запроса. В результате используются относительные пути.
По этому поводу уже есть пара проблем, но они не предполагают, что в любом случае вы можете использовать какие-либо свойства для установки базового URL-адреса. Что кажется досадным.
Есть несколько простых вопросов, ответы на которые наводят на мысль, что вам нужно передать детали запроса в новую ветку. Вот парочка на случай, если вы их еще не нашли.
Спасибо за помощь! да, мне удалось найти проблему с отложенным результатом и похожие ссылки.