perf:优化路由解析规则,增强兼容性
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 -> Demo,AdminDemo2 -> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user