【发布时间】:2020-12-21 17:26:57
【问题描述】:
假设我有以下控制器及其父类:
@RestController
public class BusinessController extends RootController {
@GetMapping(value = "users", produces = {"application/json"})
@ResponseBody
public String users() {
return "{ \"users\": [] }"
}
@GetMapping(value = "companies", produces = {"application/json"})
@ResponseBody
public String companies() {
return "{ \"companies\": [] }"
}
}
@RestController
@RequestMapping(path = "api")
public class RootController {
}
通过调用这样的 URL 来检索数据:
http://app.company.com/api/users
http://app.company.com/api/companies
现在假设我想将 /api 路径重命名为 /rest,但通过在新 URI 旁边返回 301 HTTP 状态代码来保持它“可用”
例如客户要求:
GET /api/users HTTP/1.1
Host: app.company.com
服务器请求:
HTTP/1.1 301 Moved Permanently
Location: http://app.company.com/rest/users
所以我打算在我的父控制器中从"api" 更改为"rest":
@RestController
@RequestMapping(path = "rest")
public class RootController {
}
然后引入一个“遗留”控制器:
@RestController
@RequestMapping(path = "api")
public class LegacyRootController {
}
但是现在如何让它“重写”“旧”URI?
这就是我正在努力解决的问题,无论是在 StackOverflow 上还是在其他地方,我都找不到任何与 Spring 相关的内容。
我还有很多控制器和很多方法端点,所以我不能手动执行此操作(即通过编辑每个 @RequestMapping/@GetMapping 注释)。
我正在做的项目是基于 Spring Boot 2.1
编辑:我删除了/business 路径,因为实际上继承在“默认情况下”不起作用(请参阅Spring MVC @RequestMapping Inheritance 或Modifying @RequestMappings on startup 之类的问题和答案) - 抱歉。
【问题讨论】:
-
我已经提供了一个答案,该答案对这个问题采取了直截了当的方法。如果您想在对您的应用程序的每个请求上都有一个毯子 301 和位置标头,请让我知道您是否有扩展 MvcConfigurerAdapter 的配置
-
实际上,由于该项目基于 Spring Boot,我只有一个使用
@SpringBootApplication注释的配置类和一堆其他使用传统 Spring 的@Configuration注释的配置类,它们提供了一些@Bean或@Component;其中只有 1 个是public class SecurityConfig extends WebSecurityConfigurerAdapter来自定义 Spring Security。
标签: spring spring-boot url-rewriting http-status-code-301 request-mapping