亲宝软件园·资讯

展开

根据目录结构生成API接口前缀

Y7000也拯救不了我 人气:0

一、根据目录结构生成接口前缀

在写api的接口时,通常有很多版本的迭代,比如:v1、v2。

如图所示,建立的包结构。

列举v1版本,每新建一个controller都要写上@RequestMapping("/v1/****")的路由的前缀,如果v1下面还有几个包结构,这样路由就要写的很麻烦。

我们可以通过当前api下的目录结构自动加上请求前缀。

二、自定义RequestMappingInfo

在Spring里有一个专门处理拥有@RequestMapping()注解的控制器的类(RequestMappingHandlerMapping),因为我们要修改控制器的路由。

public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
    @Value("${api-package}")
    private String apiPackagePath;
    @Override
    protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
        RequestMappingInfo mappingForMethod = super.getMappingForMethod(method, handlerType);
        String prefix = getPrefix(handlerType);
        if (mappingForMethod!=null){
           return RequestMappingInfo.paths(prefix).build().combine(mappingForMethod);
        }
        return mappingForMethod;
    }
    private String getPrefix(Class<?> handlerType){
        String packageName = handlerType.getPackage().getName();
        String doPath = packageName.replaceAll(this.apiPackagePath, "");
        return doPath.replace('.', '/');
    }
}
@Component
public class AutoPrefixConfiguration implements WebMvcRegistrations {
    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new AutoPrefixUrlMapping();
    }
}

三、测试

在v1包下新建一个controller

@RestController()
@RequestMapping("/banner")
public class BannerController {
    @GetMapping("/test")
    public String test() {
        return "你好 hello";
    }
}

启动主程序,测试接口http://localhost:8080/v1/banner/test,

自动合并了路由,v1是自动拼接的。

将controller移动到v2的sample包下,controller的请求路径没有修改。

这是重新服务再访问http://localhost:8080/v2/sample/banner/test。

成功访问,不管目录多么复杂都实现了根据目录结构生成路由前缀,不用修改控制器的requestMapping。

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

加载全部内容

相关教程
猜你喜欢
用户评论