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 name = handlerType.getName();
String[] names = name.split("[.]"); String[] names = name.split("[.]");
name = names[names.length - 1]; name = names[names.length - 1];
cname = name.replace(ConvertUtil.pathToClassName(prefix), "") return ConvertUtil.extractController2Path(ConvertUtil.pathToClassName(prefix), name);
.replace("Controller", "");
return ConvertUtil.classNameToPath(cname);
} }
/** /**
@@ -101,4 +99,4 @@ public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
dotPath = "/" + CollUtil.join(paths, "/"); dotPath = "/" + CollUtil.join(paths, "/");
return dotPath; return dotPath;
} }
} }

View File

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