在之前写的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();
}
}
注意这个方法有一个巨坑!
就是springboot的版本,不能太高。使用2.6.4就会无法run项目,会重复加载。使用2.2.2.RELEASE则正常
扩展学习:
如果我们的配置的错误message是中文的话,很容易因为字符串编码的原因而乱码,如何解决呢?
菜单栏》》设置》》Editor》》File Encodings
下面我们讲解如何使用yml文件及编译启动第一个Springboot