spring 使用 HATEOAS 启动生成没有主机和端口的链接

spring boot using HATEOAS generates links without host and port

我正在使用 HATEOAS 版本 0.25 附带的 spring 引导版本 2.0.6。我正在使用一个资源汇编器,它利用 ControllerLinkBuilder 来生成资源 link。但是,问题是它会生成相对 links,如何将其配置为使用任一请求 headers 中的 hostport 方案(应用程序将 运行 作为 dev、qa 和 prod 中的 docker 容器)或当 运行 在本地从 IDE 配置属性时。

我得到 link 尊重 X-Forwarded-Host header

"_links": {
        "self": {
            "href": "http://something.io/data/api/customers"
        }
    }

如果我显式添加 header X-Forwarded-Host 并使用此代码生成自我 link

Link self = new Link(
                        ServletUriComponentsBuilder.fromRequestUri(request).buildAndExpand(pageable).toUri().toString(),
                        "self");

但是在资源汇编程序中,我依赖于来自 ControllerLinkBuilder 的通常 linkTo 调用,主机和端口未在 link.

中呈现
"_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) {
}

我在这里传递请求 object 因为 linkTo 给出了 url 没有主机和端口

我正在使用客户资源汇编程序 from the code here,spring hateoas exmaples 自动连接到此控制器

@Autowired
private CustomerResourceAssember customerResourceAssembler;

这就是我调用分页资源汇编程序的方式

assembler.toResource(result, customerResourceAssembler, self)

spring-hateoas中的UriComponentsBuilder调用RequestContextHolder.getRequestAttributes()获取请求属性。这些由调度程序 servlet 附加到线程。当您使用 DeferredResult 时,您已经返回了具有请求属性的线程。用于构建链接的线程没有任何请求属性。这导致使用相对路径。

已经有一些关于它的问题,但他们并不建议您无论如何都可以使用任何属性来设置基数 url。这似乎是一种耻辱。

有几个类似的问题,答案似乎表明您需要将请求详细信息传递给新线程。这里有一些,以防您还没有找到它们。

  • Spring MVC + DeferredResult add Hateoas stuff