如何在Spring Boot中为所有控制器指定前缀?

我有/user/order控制器映射:

 @RestController @RequestMapping("/users") public class UserController { ... } @RestController @RequestMapping("/orders") public class OrderController { ... } 

我想分别通过URL访问http://localhost:8080/api/usershttp://localhost:8080/api/orders

我如何在Spring Boot中实现这一目标?

您可以在自定义配置中将Spring启动应用程序的根上下文路径映射到/api/*

 import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.DispatcherServlet; @Configuration public class DispatcherServletCustomConfiguration { @Bean public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } @Bean public ServletRegistrationBean dispatcherServletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean( dispatcherServlet(), "/api/"); registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); return registration; } } 

或者将其添加到src\main\resources文件夹中的application.properties

 server.contextPath=/api/* 

更多你在这里找到Spring Boot Context Root and here 将servlet映射添加到DispatcherServlet

如果你想为某些控制器添加前缀,我发现了另外两个解决方案

使用spring SpEL为控制器添加前缀变量

 @RestController @RequestMapping(path = "${v1API}/users") public class V1FruitsController { @GetMapping(path = "") @ResponseBody public String list(){ return "[\"Joe\", \"Peter\"]"; } } 

application.properties

 v1API=/api/v1 

创建自定义控制器注释

 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component @RequestMapping("/api/v1") public @interface V1APIController { @AliasFor(annotation = Component.class) String value() default ""; } @V1APIController public class UserController { @RequestMapping("/users") @ReponseBody public String index(){ return "[\"Joe\", \"Peter\"]"; } } 

然后测试一下

 curl -X GET localhost:8080/api/users