spring 使用 HATEOAS 启动生成没有主机和端口的链接
spring boot using HATEOAS generates links without host and port
我正在使用 HATEOAS 版本 0.25
附带的 spring 引导版本 2.0.6
。我正在使用一个资源汇编器,它利用 ControllerLinkBuilder
来生成资源 link。但是,问题是它会生成相对 links,如何将其配置为使用任一请求 headers 中的 host
和 port
方案(应用程序将 运行 作为 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。这似乎是一种耻辱。
- Issues using hateos with defferedresult #574
- ControllerLinkBuilder.linkTo throws error if called outside of the context of a HTTP request #408
有几个类似的问题,答案似乎表明您需要将请求详细信息传递给新线程。这里有一些,以防您还没有找到它们。
- Spring MVC + DeferredResult add Hateoas stuff
我正在使用 HATEOAS 版本 0.25
附带的 spring 引导版本 2.0.6
。我正在使用一个资源汇编器,它利用 ControllerLinkBuilder
来生成资源 link。但是,问题是它会生成相对 links,如何将其配置为使用任一请求 headers 中的 host
和 port
方案(应用程序将 运行 作为 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。这似乎是一种耻辱。
- Issues using hateos with defferedresult #574
- ControllerLinkBuilder.linkTo throws error if called outside of the context of a HTTP request #408
有几个类似的问题,答案似乎表明您需要将请求详细信息传递给新线程。这里有一些,以防您还没有找到它们。
- Spring MVC + DeferredResult add Hateoas stuff