代码示例
/**
* 查询配置值
*
* @param configKey 配置键
* @return 配置值 {@link Result}<{@link String}>
*/
@GetMapping("/{configKey}")
@LogDetail("查询配置值")
public Result<String> querySysConfigValue(@PathVariable @NotBlank String configKey) {
String configValue = sysConfigService.querySysConfigValue(configKey);
return Result.success(configValue);
}
✅ 如果 configKey 为 null,根本不会进入这个方法
因为 @PathVariable 是 路径变量,不是查询参数。它的值来自 URL 路径的一部分,不是可选的请求体参数。
🔍 各种情况分析
| 请求 URL | 是否进入方法 | configKey 值 | 结果 |
|---|---|---|---|
GET /configs/app.name | ✅ 进入 | "app.name" | 正常处理 |
GET /configs/ | ❌ 404 | 不进入方法 | 路径不匹配,Spring 返回 404 |
GET /configs(无斜杠) | ❌ 404 | 不进入方法 | 路径不匹配 |
GET /configs/%20 | ✅ 进入 | " "(纯空格) | @NotBlank 拦截,返回 400 |
GET /configs/(路径变量为空) | ❌ 404 | 不进入方法 | 空路径段匹配不上 |
📌 为什么 configKey 不会为 null?
-
路径匹配机制:Spring 只有在 URL 路径完全匹配
/{configKey}时才会调用该方法。如果configKey这个段缺失,路径不匹配,直接返回 404。 -
@PathVariable默认是 required:即使没有显式指定required=true,它也是必需的,因为路径中必须包含这个段才能匹配。 -
null不存在于 URL 路径中:HTTP 路径中无法传递null值。null是 Java 语言的概念,URL 中不存在。
✅ 结论
| 问题 | 答案 |
|---|---|
configKey 会为 null 吗? | ❌ 不会。如果路径变量缺失,方法根本不会被调用。 |
@NotBlank 还有必要吗? | ✅ 有必要。它能拦截 空字符串 或 纯空格(如 /configs/%20),防止无效查询进入 Service 层。 |
所以 configKey 永远不会是 null,但 @NotBlank 仍然有效,用于拦截空字符串。 🎯


被折叠的 条评论
为什么被折叠?



