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

Posted 剑雪封喉r

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 这个前缀访问。

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

以上是关于SpringBoot2.x 给Controller的RequestMapping添加统一前缀的主要内容,如果未能解决你的问题,请参考以下文章

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

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

SpringBoot:SpringBoot2.X常用的注解

SpringBoot2.X新版本配置拦截器在项目中的使用

springBoot2.x 全局捕获异常

springboot2.x自定义拦截把static静态文件给拦截的坑