Skip to content

根据目录结构自动生成路由前缀

Image text

问题:BannerController类在com.zb.misszb.api.v1目录下,如何只需要在BannerController的RequestMapping里配置/banner就行,v1前缀 自动加上呢?

解决办法:配置自动路由前缀

一、在application.yml配置文件里添加controller所在的完整路径

application.yml

yml
misszb:
  api-package: com.zb.misszb.api

二、新建AutoPrefixUrlMapping.java文件,重新生成新的RequestMapping

java
package com.zb.misszb.core.hack;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.lang.reflect.Method;

public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {


    @Value("${misszb.api-package}")
    private String apiPackagePath;

    @Override
    protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
        RequestMappingInfo mappingInfo = super.getMappingForMethod(method, handlerType);
        // mappingInfo就是controller和里面的方法
        if(mappingInfo != null){
            // 生成前缀
            String prefix = this.getPrefix(handlerType);
            // 将前缀和controller里的RequestMapping合并
            // SpringBoot 2.2.2版本用这个
            // return RequestMappingInfo.paths(prefix).build().combine(mappingInfo);
            // SpringBoot 2.7.12版本用这个
            return RequestMappingInfo.paths(prefix).options(super.getBuilderConfiguration()).build().combine(mappingInfo);
        }
        return mappingInfo;
    }

    private String getPrefix(Class<?> handlerType){
        // packageName为com.zb.misszb.api.v1
        String packageName = handlerType.getPackage().getName();
        // 对packageName进行处理,将com.zb.misszb.api去掉
        String dotPath = packageName.replaceAll(this.apiPackagePath, "");
        // 返回/v1
        return dotPath.replace(".", "/");
    }
}

第三步、新建AutoPrefixConfiguration配置类,将上面新建的AutoPrefixUrlMapping类加入到容器里,并让SpringBoot可以扫码到

java
package com.zb.misszb.core.configuration;

import com.zb.misszb.core.hack.AutoPrefixUrlMapping;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

@Configuration
public class AutoPrefixConfiguration implements WebMvcRegistrations{

    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new AutoPrefixUrlMapping();
    }
}

备注

需要实现WebMvcRegistrations接口,重写getRequestMappingHandlerMapping方法

项目里加上上面的文件后,只要controller文件在com.zb.misszb.api里,不管嵌套几层,都会自动加上前缀

如有转载或 CV 的请标注本站原文地址