首頁 > 軟體

SpringBoot2.x實現給Controller的RequestMapping新增統一字首

2022-02-18 10:03:45

給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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com