@RequestParam 通过 defaultValue 可直接设置默认值,最简洁常用;required=false 时参数可缺省且取默认值;字符串默认值不自动 trim;基本类型必须提供合法字面量;数组/集合支持逗号分隔字符串。

在 Spring MVC 中,@RequestParam 可以通过 defaultValue 属性直接设置参数默认值,无需额外判断或使用 Optional(除非有特殊需求)。
使用 defaultValue 指定默认值
这是最常用、最简洁的方式。当请求中未携带该参数时,Spring 会自动注入指定的默认值,且参数会被视为“必须存在”(即 required = true 的默认行为被覆盖)。
-
defaultValue的值会尝试转换为目标类型(如int、boolean、自定义类型等),转换失败会抛出MethodArgumentTypeMismatchException - 若同时设置
required = false,则参数可缺省,且未传时取默认值;若不写required,defaultValue本身已隐含required = false - 字符串默认值支持空格,但注意前后空格不会被自动 trim(需手动处理)
示例:
@GetMapping("/search")
public String search(
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "keyword", defaultValue = "") String keyword) {
// page 默认为 1,size 默认为 10,keyword 默认为空字符串
return "result";
}
用 required = false + if 判断(不推荐用于默认值)
仅当需要区分“参数未传”和“参数传了 null 或空值”时才考虑这种方式。它不设默认值,而是把参数接收为包装类型或 String,再手动赋值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适用于逻辑复杂、默认值需动态计算的场景(比如取当前时间、查配置中心)
- 普通静态默认值应优先用
defaultValue,更清晰、更安全、更符合 Spring 设计意图
示例(不推荐仅为了设固定默认值而这么写):
@GetMapping("/info")
public String getInfo(@RequestParam(required = false) String name) {
if (name == null || name.trim().isEmpty()) {
name = "anonymous";
}
return "Hello, " + name;
}
配合 Optional 使用(Java 8+,语义明确)
当希望显式表达“参数可选”,且想延迟决定默认值(比如做条件 fallback),可用 Optional。此时 defaultValue 不生效,必须靠代码处理。
-
@RequestParam参数类型为Optional<T>时,required和defaultValue属性将被忽略 - 适合需要统一处理多个可选参数、或默认值依赖其他上下文的场景
示例:
@GetMapping("/user")
public String getUser(@RequestParam Optional<String> role) {
String actualRole = role.orElse("user"); // 未传时用 "user"
return "Role: " + actualRole;
}
注意事项与常见问题
避免踩坑的关键点:
-
defaultValue = "null"是字符串"null",不是 Java 的null;如需表示 null,请用Optional或手动判断 - 基本类型(如
int、long)不能设为null,所以defaultValue必须提供合法字面量,否则启动报错 - 如果参数是数组或集合(如
String[]或List<String>),defaultValue支持用逗号分隔的字符串(如"a,b,c"),Spring 会自动拆分 - 中文或特殊字符作默认值时,确保编码一致(通常 UTF-8,无额外转码)

















