【发布时间】:2014-08-02 12:10:24
【问题描述】:
Spring HATEOAS 提供了方便的ControllerLinkBuilder 来创建到控制器方法的链接,这些链接将作为hrefs 添加到返回给客户端的JSON/XML 中。例如:
resource.add(linkTo(methodOn(FooController.class)
.findFoo(entity.getClient().getId()))
.withRel("show"));
... 可能会生成类似于以下内容的 JSON:
{
"name":"foo",
"links":[
{"rel":"show","href":"http://111.11.11.111:28080/foos/1"}
]
}
不过……
我倾向于通过反向代理访问我的服务。我想大多数人可能会。这让我可以在不同的端口上运行多个服务,但让我可以通过相同的基本 URL 访问它们。不幸的是,通过代理访问意味着 Spring HATEOAS 生成的 URL 不是对访问资源有效的 URL。
现在我可以对链接进行硬编码,但这相当脆弱。让 ControllerLinkBuilder 根据我的控制器 @RequestMapping 配置生成 URL 对我来说很有价值,因为它避免了我的链接与现实不同步的风险。
所以我想知道是否有一个属性可以用来强制主机和端口值。我正在使用 Spring Boot,因此理想情况下,我可以将一个属性添加到每个环境中的 application.properties 文件中。
注意:
由于这个问题似乎是由 Spring 中的错误引起的,我应该指出我使用的是 Spring Boot 1.0.2.RELEASE。
【问题讨论】:
-
通过
ControllerLinkBuilder的代码,看起来它应该使用X-Forwarded-Host标头来生成链接。我会做更多的测试,但很可能是我的链接不正确,因为我的反向代理没有正确设置标题。 -
如果您将嵌入式 Tomcat 与 Spring Boot 一起使用,它将默认设置一个阀门来填充标头。如果您要部署到现有容器,则必须自己设置阀门。
-
我使用的是 Spring Boot 嵌入式 Tomcat。我现在已经确认设置了一个没有端口的
X-Forwarded-Host标头。主机部分设置正确,所以我正在尝试调试ControllerLinkBuilder以确定为什么它似乎附加了server.port值而不是关闭它。 -
这看起来像是
ServletUriComponentsBuilder中的一个错误,它也已复制到ControllerLinkBuilder的代码中。我会发布一个包含详细信息的答案。
标签: spring-boot spring-hateoas