同时使用@ModelAttribute和@PathVariable时要注意命名的同名问题,因为Spring MVC会默认根据参数名和属性名的匹配来填充属性值

请看下面的例子,当实体类里面有字段id,同时@GetMapping路径中有同名参数id,

当刚进入userForm方法时,发现user对象里面的id就已经有值了(可以打印user对象出来看看),

但实际上我想对 @ModelAttribute("userForm") User user赋值的操作还未开始,那

为什么user里面的id字段被自动填充了?

@Data
public class User {
	private String id;
	private String name;
}
@GetMapping("/{id}/userRegister")
public String userForm(
            @ModelAttribute("form") User user,
		    @PathVariable String id) {
        ...
}

这是因为:

        在Spring MVC中,`@ModelAttribute` 注解用于绑定表单数据到一个模型对象,以便在Controller方法中处理。当使用 `@ModelAttribute` 注解时,Spring MVC会尝试从请求参数中匹配模型对象的属性,并填充这些属性的值。

        在上面的代码中,`userForm` 方法使用 `@ModelAttribute` 注解来接收 `User` 对象,并将其命名为 "form"。同时,请求路径中包含一个路径变量 `id`。

        Spring MVC会尝试将请求中的参数与 `User` 对象的属性进行匹配。如果请求参数中包含一个名为 "id" 的参数,Spring MVC会尝试将这个参数的值赋给 `User` 对象中的同名属性。这是默认行为,根据参数名和属性名的匹配来填充属性值。

        如果你不希望路径变量 `id` 被自动填充到 `User` 对象中的 `id` 属性中,你可以将参数名与模型属性的名称区分开,

如下所示:

@GetMapping("/{id}/userRegister")
public String userForm(@ModelAttribute("form") User user,
        @PathVariable String pathId) {
    // 这里的 pathId 不会自动填充到 User 对象的 id 属性中
    // 你可以在这里根据需要处理 pathId
    // ...
}

        通过将参数名修改为 `pathId`,可以防止与模型属性的名称冲突,从而避免自动填充。这样,你可以自行处理路径变量 `id` 的值,而不影响 `User` 对象的属性。

可能你还有疑问,为什么路径中的id不需要改成pathId呢?

这也是为何我没有把id改成pathId的原因,为了让你能看的更直观而避免混淆。

        对于 `@PathVariable` 注解,它从请求的 URL 路径中提取变量值,并将这些值绑定到相应的方法参数上。在上面的例子中,`@PathVariable` 注解的参数名称为 `pathId`,而不是 `id`。这意味着从路径中提取的值将被绑定到 `pathId` 参数上,而不是 `User` 对象中的 `id` 属性上。

        例如,假设你的请求路径是 `/{id}/userRegister`,当一个请求进来时,Spring MVC 会自动解析 URL 路径中的 `id` 值,并将它绑定到 `pathId` 参数上。这是因为你在方法签名中使用了 `@PathVariable` 注解,告诉Spring MVC 从路径中提取 `id` 值并绑定到 `pathId` 参数上。

换句话说,使用@PathVariable` 注解将路径中的参数赋值给@PathVariable后面接的参数中,至于这个参数叫什么,只影响到后面你对这个参数的操作,而不影响他的来源。

        所以,在上面的代码中,当请求路径为 `/{id}/userRegister` 时,`@PathVariable String pathId` 将自动获取路径中的 `id` 值,而不会影响 `User` 对象中的 `id` 属性。这种默认行为使得在处理路径变量时非常方便。具体选择取决于你的需求和代码的结构。


版权声明:本文为CSDN博主「StephanieXYM」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/StephanieXYM/article/details/132906348​​​​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值