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

新手上路,请多包涵

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

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

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

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

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

原文由 Murali 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 730
2 个回答

您可以在自定义配置中提供到 spring boot 应用程序的根上下文路径到 /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;
    }
}

或将此添加到您的 application.propertiessrc\main\resources 文件夹中

server.contextPath=/api

编辑

从 Spring Boot 2.x 开始,该属性已被弃用,应替换为

server.servlet.contextPath=/api

您可以在此处找到更多信息 Spring Boot Context Root 和此处 将 servlet 映射添加到 DispatcherServlet

原文由 Tomasz Janek 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

选项 1 - 使用 spring SpEL 为您的控制器添加前缀变量

@RestController
@RequestMapping(path = "${v1API}/users")
public class V1FruitsController {

    @GetMapping(path = "")
    @ResponseBody
    public String list(){
        return "[\"Joe\", \"Peter\"]";
    }
}

应用程序.properties

 v1API=/api/v1

选项 2 - 创建自定义控制器注释

@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/v1/users

原文由 deFreitas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题