весенняя загрузка с использованием HATEOAS генерирует ссылки без хоста и порта - PullRequest
0 голосов
/ 21 декабря 2018

Я использую версию весенней загрузки 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)

1 Ответ

0 голосов
/ 22 декабря 2018

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

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

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

...