如何使用两个 URL 映射

Posted

技术标签:

【中文标题】如何使用两个 URL 映射【英文标题】:How to use two URL mappings 【发布时间】:2015-02-10 14:40:41 【问题描述】:

我想将我的应用程序迁移到 Spring Boot Jar Deployment。它目前使用没有 Boot 的 Spring 4。

我有一个在 /api/* 监听的 REST-API 和一个在 src/main/webappjavascript 前端,可以通过 /* 访问。

现在我找不到在 Boot 中做同样事情的方法。

通过更改server.context-path 属性,我设法让我的api 在/api/* 上监听,但我没有设法在/* 注册第二个servlet 来服务我的js 前端。我知道 jar 部署不支持 src/main/webapp,我也知道 Spring Boot 提供来自 src/resources/publicsrc/resources/static 的静态文件。但在我的情况下,这些文件夹也指向/api/*,因为server.context-path 发生了变化。

我尝试将另一个 servlet 注册为 bean。这破坏了我的 api-endpoint。

实现这一目标的最佳方法是什么?

【问题讨论】:

【参考方案1】:

对于多个映射,您必须为每个映射添加一个,然后在控制器中进行映射,如下所示。

 @Controller
 @RequestMapping(value =  "$url.mapping","$url.mapping.two" )
 public class CustomerController

【讨论】:

【参考方案2】:

第一个选项 - 将 src/main/webapp 中的所有内容复制到 src/resources/static。这是 Spring Boot 寻找静态内容的地方。

第二个选项,继续使用src/main/webapp,但配置您的构建以将静态资源复制到target/classes/static。我在之前的回答中为此提供了 Maven 配置:Refreshing static content with Spring MVC and Boot

请注意,如果您选择第一个选项,如果您希望修改内容并在不运行构建的情况下自动重新加载它,您将需要在 IDE 中运行您的应用程序。如果您正在执行您的 jar,则使用第二个选项可为您提供通常的 Tomcat 重新加载静态内容,但可能会导致一些混乱。就个人而言,我大部分时间都选择第二个选项,因为我喜欢在命令行上运行应用程序并使用 Chrome 开发工具编辑我的 html 和 JavaScript。

【讨论】:

我知道这个解决方案,但问题是我将默认 servlet 映射到 /api/*。同样src/resources/static 下的所有内容都将映射到/api/*。但我希望它映射到/* 如果你想映射到/*,那么你需要删除你的servlet上下文映射到/api/*,一切都应该正常工作。您的 REST 控制器应定义自己的到 /api/whatever 的映射。 但因此我尝试注册第二个 servlet。如果它从/web/* 开始也可以。但是在每个控制器前面加上api 听起来不是很干净。 在这种情况下,可能值得重新编写您的问题以明确这就是您想要实现的目标。 @DavidSchilling 如果您的所有 API 端点都在一个控制器中,您可以添加一个类级别的 @RequestMapping("/api/"),它将作为所有方法级别 @RequestMappings 的前缀。

以上是关于如何使用两个 URL 映射的主要内容,如果未能解决你的问题,请参考以下文章

在 ServletRequests 上使用 java Filter 时如何检查 url 是不是具有有效映射

学习vue第二十二节,路由的基本使用方法

角度如何在路由中使用 url 映射组件?

Apple 映射 URL 方案,如何使用 near 参数

如何在 struts2 中映射长 REST url - 使用 struts2 rest 插件

如何在 PrettyFaces 的帮助下将长的 Liferay URL 映射到友好的 URL?