SprintBoot系列(七):按路径自定义路由

在之前写的demo中,我们的路由都是通过@RequestMapping(“value”)设置。

例如api下面的方法,如果每次定义路由都要写v1/v2等信息,容易写错而且繁琐,能否让路由自动根据目录架构来,开发者只需要设置访问名即可。例如:@GetMapping(“/v1/api/banner”),去掉” “/v1/api/”

首先说一下思路:

  • 创建一个类重写路由
  • 获取当前目录路径和项目路径,得到两者之差
  • 拼接

1、在参数配置文件中添加该项目的根目录

在resource/application.properties追加以下代码

porject.PathName=com.fcors.fcors.api

2、创建AutoPrefixUrlMapping类

在core中创建一个package,并命名为hack,在下面创建一个AutoPrefixUrlMapping类

package com.fcors.fcors.core.hack;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
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("${porject-PathName}")
    private String apiPackagePath;

    @Override
    protected  RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
        RequestMappingInfo mappingInfo =  super.getMappingForMethod(method, handlerType);
        if(mappingInfo != null){
            String prefix = this.getPrefix(handlerType);
            return RequestMappingInfo.paths(prefix).build().combine(mappingInfo);
        }
        return mappingInfo;
    }

    private String getPrefix(Class<?> handlerType){
        String packageName = handlerType.getPackage().getName();
        String dotPath = packageName.replaceAll(this.apiPackagePath,"");
        return dotPath.replace(".", "/");
    }
}

3、创建一个AutoPrefixConfiguration类

在core/configuration中创建一个AutoPrefixConfiguration

package com.fcors.fcors.core.configuration;

import com.fcors.fcors.core.hack.AutoPrefixUrlMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

@Component
public class AutoPrefixConfigurationImpl implements WebMvcRegistrations {
    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new AutoPrefixUrlMapping();
    }
}
JAVA、基础技术、技术与框架SprintBoot系列(七):按路径自定义路由插图

注意这个方法有一个巨坑!

就是springboot的版本,不能太高。使用2.6.4就会无法run项目,会重复加载。使用2.2.2.RELEASE则正常

扩展学习:

如果我们的配置的错误message是中文的话,很容易因为字符串编码的原因而乱码,如何解决呢?

菜单栏》》设置》》Editor》》File Encodings

JAVA、基础技术、技术与框架SprintBoot系列(七):按路径自定义路由插图1

下面我们讲解如何使用yml文件及编译启动第一个Springboot

http://www.fcors.com/%e6%8a%80%e6%9c%af%e4%b8%8e%e6%a1%86%e6%9e%b6/sprintboot%e7%b3%bb%e5%88%97%ef%bc%88%e5%85%ab%ef%bc%89%ef%bc%9ayml%e6%96%87%e4%bb%b6%e8%ae%be%e7%bd%ae%e5%a4%9a%e7%8e%af%e5%a2%83%e5%90%af%e5%8a%a8%e7%ac%ac%e4%b8%80%e4%b8%aaspringboot%e5%ba%94/