使用HATEOAS的Spring Boot生成没有主机和端口的链接

时间:2018-12-21 09:04:33

标签: spring spring-mvc spring-boot spring-hateoas spring-web

我正在使用HATEOAS版本2.0.6附带的Spring Boot版本0.25。我正在使用使用ControllerLinkBuilder的资源汇编器来生成资源链接。但是,问题在于它会生成相对链接,如何配置它以使用来自请求标头的hostport方案(该应用将在dev,qa和prod中作为docker容器运行)或从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给出了没有主机和端口的网址

我正在使用客户资源汇编器from the code here,它是自动装配到此控制器的spring hateoas实例

@Autowired
private CustomerResourceAssember customerResourceAssembler;

这就是我所谓的分页资源汇编器

assembler.toResource(result, customerResourceAssembler, self)

1 个答案:

答案 0 :(得分:1)

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

已经有很多问题,但是它们并不表明您仍然可以使用任何属性来设置基本URL。真可惜。

有几个类似的问题,答案似乎表明您需要将请求详细信息传递给新线程。这是一对夫妇,以防您尚未找到它们。