欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot2.x实现给Controller的RequestMapping添加统一前缀

程序员文章站 2023-01-23 10:43:19
目录给controller的requestmapping添加统一前缀总结一下 有几个方法springboot项目添加全局前缀spring的配置spring boot的配置给controller的req...

给controller的requestmapping添加统一前缀

如何给controller的requestmapping添加统一前缀,比如"/api",为什么要添加统一访问前缀,其实是为了后面的接口的管理。

切记:约定与规范好过一切技术处理 !

比如:

  • 项目a必须所有访问接口url必须增加 /api/projecta/
  • 项目b必须所有访问接口url必须增加 /api/projectb/
  • 看到url里面含有/api 表示访问后端接口服务,/projecta/ 一看就知道是项目a提供的服务接口。

总结一下 有几个方法

1、在配置application.yml文件中添加:

  servlet:
    context-path: /api #(不同springboot版本会有区别,这里是采用2.x)

但是这个其实是整个项目访问前缀,如果你有静态资源也需要增加 /api 这个前缀访问。

2、通过nginx 和 你的网关层 添加统一的访问路径前缀,这个不多说了。

3、springmvc 可以实现 webmvcconfigurer 接口中的 configurepathmatch 方法来实现添加统一路径前缀。

package com.middol.webbase.framework.config;
import com.middol.webbase.framework.annotation.apirestcontroller;
import com.middol.webbase.framework.annotation.reportrestcontroller;
import com.middol.webbase.framework.properties.apipathproperties;
import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.config.annotation.pathmatchconfigurer;
import org.springframework.web.servlet.config.annotation.webmvcconfigurer;
import javax.annotation.resource;
/**
 * 配置统一的后台接口访问路径的前缀
 * @author c西
 */
@configuration
public class mywebmvcconfig implements webmvcconfigurer {
    @resource
    private apipathproperties apipathproperties;
    @override
    public void configurepathmatch(pathmatchconfigurer configurer) {
        configurer
                .addpathprefix(apipathproperties.getglobalprefix(),c -> c.isannotationpresent(apirestcontroller.class))
                .addpathprefix(apipathproperties.getreportprefix(),c -> c.isannotationpresent(reportrestcontroller.class));
    }
}

意思是 对有 @apirestcontroller 注解的 controller 添加 /api前缀,对有@reportrestcontroller 注解的controller添加 /api/report 前缀。

@apirestcontroller 和 @reportrestcontroller 是自定义注解继承 @restcontroller注解。

package com.middol.webbase.framework.annotation;
import org.springframework.core.annotation.aliasfor;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;
import java.lang.annotation.*;
/**
 * controller层统一使用该注解
 * @author c西
 */
@target(elementtype.type)
@retention(retentionpolicy.runtime)
@documented
@restcontroller
@requestmapping
public @interface apirestcontroller {
    /**
     * alias for {@link requestmapping#name}.
     */
    @aliasfor(annotation = requestmapping.class)
    string name() default "";
    /**
     * alias for {@link requestmapping#value}.
     */
    @aliasfor(annotation = requestmapping.class)
    string[] value() default {};
    /**
     * alias for {@link requestmapping#path}.
     */
    @aliasfor(annotation = requestmapping.class)
    string[] path() default {};
}

然后 你的业务controller 层代码添加 @apirestcontroller 即可,如下:

@api(value = "demouser增删改查接口", tags = "【测试接口】")
@apirestcontroller("demouser")
public class demousercontroller extends basecontroller{
}

其中 apipathproperties 是统一前缀名称管理,可以在yml中修改,我这里设置了两个 一般的crud接口 /api , 报表服务接口 统一为 /api/report,各自看各自服务定到底设置几个。

package com.middol.webbase.framework.properties;
import lombok.data;
import org.springframework.boot.context.properties.configurationproperties;
import org.springframework.stereotype.component;
/**
 * 接口路径前缀配置
 * @author c西
 */
@component
@configurationproperties(prefix = "api.path")
@data
public class apipathproperties {
    string globalprefix = "api";
    string reportprefix = "api/report";
}

application.yml文件中添加如下

## 专门针对 controller层接口路径前缀全局配置
api:
  path:
    global-prefix: api
    report-prefix: api/report

springboot项目添加全局前缀

spring的配置

spring.application.name: article (spring boot下无效)

spring boot的配置

(springboot你自己设置的前缀名称)

properties文件

server.servlet.context-path: /springboot

yml文件

server:
  servlet:
    context-path: /springboot

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。