V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
brucefu
V2EX  ›  Java

Sprng Boot 中,想在 20 个 Controller 的 @RequestMapping 中添加相同的前缀,有便捷的方法吗?

  •  
  •   brucefu · 2018-11-21 11:16:19 +08:00 · 5004 次点击
    这是一个创建于 1954 天前的主题,其中的信息可能已经有所发展或是发生改变。

    eg:两个 RequestMapping"/table""/user"。想同一改成"/v1/table""/v1/user"

    15 条回复    2018-11-23 15:37:21 +08:00
    gejun123456
        1
    gejun123456  
       2018-11-21 11:22:34 +08:00
    写个 java main 函数 正则表达式 匹配替换
    mineqiqi
        2
    mineqiqi  
       2018-11-21 11:50:56 +08:00   ❤️ 1
    如果所有的 controller 都是这个前缀开头,可以 server.servlet.context-path 加这个配置
    brucefu
        3
    brucefu  
    OP
       2018-11-21 12:00:32 +08:00
    @mineqiqi 有用,如果只修改其中 20 个呢?我尝试使用继承的方式,无效果。
    ClutchBear
        4
    ClutchBear  
       2018-11-21 12:35:25 +08:00
    我们这里的解决方式是:
    定义一个静态变量 path=v1
    这 20 个都用这个镜头变量拼接,
    后面再需要改成 v2 的话, 只需要改 path 的赋值就行.
    xiluo
        5
    xiluo  
       2018-11-21 12:43:20 +08:00
    https://stackoverflow.com/questions/28006501/how-to-specify-prefix-for-all-controllers-in-spring-boot

    You can provide a mapping to root context path of your spring boot application to /api/* in your custom configuration.
    ```java
    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;
    }
    }

    ```
    or add this to your application.properties in src\main\resources folder
    ```
    server.contextPath=/api/*
    ```
    zzlhr
        6
    zzlhr  
       2018-11-21 17:31:04 +08:00
    zuul?
    mebixus
        7
    mebixus  
       2018-11-21 17:40:31 +08:00   ❤️ 1
    咳咳,如果只有 20 个,并且不会频繁改动的话,在 idea 里 command+shift+R (快捷键可能不一样)在整个工程里搜索替换一下就可以了啊。
    Guozi1989
        8
    Guozi1989  
       2018-11-21 17:45:18 +08:00
    20 个应该不多,一个个的加吧。如果全部要替换的话就是 `server.contextPath=/V1/*`
    x7395759
        9
    x7395759  
       2018-11-21 17:51:13 +08:00
    对修改关闭,对拓展开放
    StevenTong
        10
    StevenTong  
       2018-11-21 18:04:20 +08:00
    整个工程替换就加 gateway 不是的话 批量替换
    zek
        11
    zek  
       2018-11-21 18:16:54 +08:00 via Android
    @mebixus 没毛病
    zjengjie
        12
    zjengjie  
       2018-11-21 19:26:40 +08:00   ❤️ 1
    可以重写 RequestMappingHandlerMapping 的 registerHandlerMethod,在里面判断哪些 controller 需要修改,然后创建一个新的 RequestMappingInfo 代替原来的。
    deweixu
        13
    deweixu  
       2018-11-21 20:05:41 +08:00
    用 nginx 反向代理,在 nginx 配置里加,手动加狗头。
    ioiogoo
        14
    ioiogoo  
       2018-11-22 08:59:02 +08:00
    如果是全局的前缀的话,在配置文件里面加
    server.servlet.path=/v1,适用于 spring boot
    571726193
        15
    571726193  
       2018-11-23 15:37:21 +08:00
    我记得继承是可以的 因为我上一家公司就是这样的 用继承解决的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1541 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 17:02 · PVG 01:02 · LAX 10:02 · JFK 13:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.