Весенняя загрузка с использованием HATEOAS генерирует ссылки без хоста и порта

Я использую весеннюю загрузочную версию 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)
1
0
2 130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

UriComponentsBuilder в spring-hateoas вызывает RequestContextHolder.getRequestAttributes() для получения атрибутов запроса. Они прикрепляются к потоку сервлетом диспетчера. Поскольку вы используете DeferredResult, вы уже вернули поток с атрибутами запроса. Поток, используемый для построения ссылок, не имеет атрибутов запроса. В результате используются относительные пути.

По этому поводу уже есть пара проблем, но они не предполагают, что в любом случае вы можете использовать какие-либо свойства для установки базового URL-адреса. Что кажется досадным.

Есть несколько простых вопросов, ответы на которые наводят на мысль, что вам нужно передать детали запроса в новую ветку. Вот парочка на случай, если вы их еще не нашли.

Спасибо за помощь! да, мне удалось найти проблему с отложенным результатом и похожие ссылки.

Anadi Misra 22.12.2018 04:30

Другие вопросы по теме