如何在Spring Boot中为所有控制器指定前缀?
我有/user
和/order
控制器映射:
@RestController @RequestMapping("/users") public class UserController { ... } @RestController @RequestMapping("/orders") public class OrderController { ... }
我想分别通过URL访问http://localhost:8080/api/users
和http://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