如何使用两个 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/webapp
的 javascript 前端,可以通过 /*
访问。
现在我找不到在 Boot 中做同样事情的方法。
通过更改server.context-path
属性,我设法让我的api 在/api/*
上监听,但我没有设法在/*
注册第二个servlet 来服务我的js 前端。我知道 jar 部署不支持 src/main/webapp
,我也知道 Spring Boot 提供来自 src/resources/public
和 src/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/")
,它将作为所有方法级别 @RequestMapping
s 的前缀。以上是关于如何使用两个 URL 映射的主要内容,如果未能解决你的问题,请参考以下文章
在 ServletRequests 上使用 java Filter 时如何检查 url 是不是具有有效映射