如何控制Spring Hateoas生成链接的Web上下文?

Nat*_*ell 12 spring webcontext spring-hateoas

我们正在构建API并使用Spring RestControllers和Spring HATEOAS.
将war文件部署到容器并发出GET请求时http://localhost:8080/placesapi-packaged-war-1.0.0-SNAPSHOT/places,HATEOAS链接如下所示:

{
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost:8080/placesapi-packaged-war-1.0.0-SNAPSHOT/places",
    "lastModified" : "292269055-12-02T16:47:04Z"
  } ]
}
Run Code Online (Sandbox Code Playgroud)

在网络方面是,部署的应用程序(如:placesapi-packaged-war-1.0.0-SNAPSHOT)

在真实的运行时环境(UAT及更高版本)中,容器可能位于http服务器后面,例如Apache虚拟主机或类似的Web应用程序.像这样的东西:

<VirtualHost Nathans-MacBook-Pro.local>
   ServerName Nathans-MacBook-Pro.local

   <Proxy *>
     AddDefaultCharset Off
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / ajp://localhost:8009/placesapi-packaged-war-1.0.0-SNAPSHOT/
   ProxyPassReverse / ajp://localhost:8009/placesapi-packaged-war-1.0.0-SNAPSHOT/

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

使用上面的内容,当我们发出GET请求时http://nathans-macbook-pro.local/places,结果响应如下所示:

{
  "links": [ {
    "rel": "self",
    "href": "http://nathans-macbook-pro.local/placesapi-packaged-war-1.0.0-SNAPSHOT/places",
    "lastModified": "292269055-12-02T16:47:04Z"
  } ]
}
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为响应中的链接包含Web应用程序上下文,如果客户端要关注该链接,他们将获得404

有谁知道如何控制Spring HATEOAS这方面的行为?基本上我需要能够控制它在链接中生成的Web上下文名称.

我做了一些调整,可以看到使用自定义标头,X-Forwarded-Host您可以控制主机和端口,但我看不到任何类似的能够控制上下文.

我们考虑的其他选项涉及将应用程序部署到ROOT上下文或固定的命名上下文,然后相应地设置我们的虚拟主机.然而,这些感觉就像妥协而不是解决方案,因为理想情况下我们希望在同一容器上托管应用程序的多个版本(例如:placesapi-packaged-war-1.0.0-RELEASE,placesapi-packaged-war-1.0.1- RELEASE,placesapi-packaged-war-2.0.0-RELEASE等)并根据http请求标头将虚拟主机转发到正确的应用程序.


干杯,非常感谢对此的任何想法

弥敦道

Ste*_*eve 3

首先,如果您不知道,您可以通过创建webapp/META-INF/context.xml包含以下行的内容来控制 Web 应用程序的上下文(至少在 Tomcat 下):

<Context path="/" />
Run Code Online (Sandbox Code Playgroud)

...这将使应用程序上下文设置为与您正在使用的相同(/)。

然而,这不是你的问题。不久前我提出了类似的问题。因此,据我所知,没有现成的机制可以手动控制生成的链接。相反,我创建了自己的修改版本ControllerLinkBuilder,它使用 中定义的属性构建了 URL 的基础application.properties。如果在应用程序本身上设置上下文不是一个选项(即,如果您在同一个 Tomcat 实例下运行多个版本),那么我认为这是您唯一的选择,如果ControllerLinkBuilder没有正确构建您的 URL。