我正在使用HATEOAS版本2.0.6
附带的Spring Boot版本0.25
。我正在使用使用ControllerLinkBuilder
的资源汇编器来生成资源链接。但是,问题在于它会生成相对链接,如何配置它以使用来自请求标头的host
和port
方案(该应用将在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)
答案 0 :(得分:1)
spring-hateoas中的UriComponentsBuilder
调用RequestContextHolder.getRequestAttributes()
以获取请求属性。这些由调度程序servlet附加到线程。使用DeferredResult时,您已经返回了带有请求属性的线程。用于构建链接的线程上没有任何请求属性。这导致使用相对路径。
已经有很多问题,但是它们并不表明您仍然可以使用任何属性来设置基本URL。真可惜。
有几个类似的问题,答案似乎表明您需要将请求详细信息传递给新线程。这是一对夫妇,以防您尚未找到它们。