【问题标题】:spring boot using HATEOAS generates links without host and portspring boot 使用 HATEOAS 生成没有主机和端口的链接
【发布时间】:2019-05-21 18:05:40
【问题描述】:

我正在使用带有 HATEOAS 版本 0.25 的 Spring Boot 版本 2.0.6。我正在使用一个资源汇编器,它利用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");

但是当在资源汇编器中我依赖来自ControllerLinkBuilder 的通常的linkTo 调用时,主机和端口不会在链接中呈现。

"_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

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

@Autowired
private CustomerResourceAssember customerResourceAssembler;

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

assembler.toResource(result, customerResourceAssembler, self)

【问题讨论】:

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


    【解决方案1】:

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

    已经有几个问题了,但他们并不建议您可以使用任何属性来设置基本 url。这似乎是一种耻辱。

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

    【讨论】:

    • 感谢您的帮助!是的,我确实设法找到了延迟结果问题和类似的链接。
    猜你喜欢
    • 2014-08-02
    • 2018-01-15
    • 2019-07-23
    • 1970-01-01
    • 2020-05-11
    • 2018-08-16
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    相关资源
    最近更新 更多