SpringBoot2.x 給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 這個前綴訪問。

  1. 通過nginx 和 你的網關層 添加統一的訪問路徑前綴,這個不多說了。

  2. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章