perf:优化路由解析规则,增强兼容性

This commit is contained in:
ruying408
2025-02-08 00:07:41 +08:00
parent 8819690870
commit 2546380962
2 changed files with 37 additions and 19 deletions

View File

@@ -77,9 +77,7 @@ public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
String name = handlerType.getName();
String[] names = name.split("[.]");
name = names[names.length - 1];
cname = name.replace(ConvertUtil.pathToClassName(prefix), "")
.replace("Controller", "");
return ConvertUtil.classNameToPath(cname);
return ConvertUtil.extractController2Path(ConvertUtil.pathToClassName(prefix), name);
}
/**

View File

@@ -11,6 +11,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.web.multipart.MultipartFile;
/**
@@ -167,21 +169,39 @@ public class ConvertUtil {
return className.toString();
}
/**
* CouponInfo 转 coupon/info
*/
public static String classNameToPath(String className) {
StringBuilder path = new StringBuilder();
for (char c : className.toCharArray()) {
if (Character.isUpperCase(c)) {
if (!path.isEmpty()) {
path.append("/");
public static String extractController2Path(String prefix, String className) {
// 1. 使用正则匹配 `Controller` 之前的部分
Pattern pattern = Pattern.compile("([A-Za-z0-9]+)Controller$");
Matcher matcher = pattern.matcher(className);
if (matcher.find()) {
String extracted = matcher.group(1); // 提取 "DemoInfo" 或 "Demo2UserInfo"
// 2. 计算前缀后缀匹配部分
String prefixSuffix = findPrefixSuffixMatch(prefix, extracted);
if (!prefixSuffix.isEmpty()) {
extracted = extracted.replaceFirst(prefixSuffix, ""); // 去掉匹配部分
}
path.append(Character.toLowerCase(c));
} else {
path.append(c);
// 3. 处理驼峰命名转换 `/` 分隔符
return formatExtractedString(extracted);
}
return "";
}
return path.toString();
private static String findPrefixSuffixMatch(String prefix, String extracted) {
if (extracted.startsWith(prefix)) {
return prefix;
}
// 从 prefix 中找出类名的前缀部分,例如 AdminDemo -> DemoAdminDemo2 -> Demo2
Pattern pattern = Pattern.compile("[A-Z][a-z0-9]*$");
Matcher matcher = pattern.matcher(prefix);
return matcher.find() ? matcher.group() : "";
}
private static String formatExtractedString(String extracted) {
// 处理驼峰命名转换DemoDataInfo3 → data/info3
extracted = extracted.replaceAll("([a-z])([A-Z])", "$1/$2").toLowerCase();
return extracted;
}
}