You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC能否使用多个ModelAttribute接收参数及绑定失效问题

问题解答

Spring完全支持在Controller接口方法中声明多个模型对象接收POST请求参数,你遇到的属性赋值为0的问题是数据绑定规则不匹配导致的,和多对象接收本身无关。

问题原因

SpringMVC默认按「请求参数名 = 对象属性名」的规则做自动绑定:

  • 你表单中输入框的name属性为guestid、hotelid
  • 但你的Guest、Hotel类中对应属性名为id
    Spring无法区分两个对象的id属性对应的请求参数,所以基础数字类型默认初始化值为0,导致你读取到的id始终是0。

解决方法

你可以任选以下任意一种方案修复:

方案1:修改表单字段命名(最简便)

按照参数名.属性名的格式修改表单输入框的name属性,你的POST接口参数名为guest、hotel,所以修改后的JSP表单部分代码如下:

<tr>
    <td>Guest id:</td>
    <td>
        <input name="guest.id" type="number">
    </td>
</tr>
<tr>
    <td>Hotel id:</td>
    <td>
        <input name="hotel.id" type="number">
    </td>
</tr>

修改后不需要调整Controller代码,即可正常绑定两个对象的id属性。

方案2:配合@ModelAttribute注解显式指定模型名

如果要使用你注释掉的Spring绑定标签,需要先在GET接口中提前初始化对应模型对象到视图中:

@RequestMapping(value="/assignguesttohotel",method = RequestMethod.GET)
public ModelAndView assignguesttohotel_form(HttpServletResponse response) throws IOException {
    ModelAndView mav = new ModelAndView("assignguesttohotel");
    // 提前初始化模型对象
    mav.addObject("guest", new Guest());
    mav.addObject("hotel", new Hotel());
    return mav;
}

再把绑定标签的path修改为对应对象名.属性名即可:

<spring:bind path="guest.id">
    <input name="${status.expression}" type="number" value="${status.value}">
</spring:bind>

<spring:bind path="hotel.id">
    <input name="${status.expression}" type="number" value="${status.value}">
</spring:bind>
方案3:直接接收参数手动封装

如果你不想修改现有表单命名,也可以直接在POST接口中接收两个参数再手动赋值给对象:

@RequestMapping(value="/assign",method = RequestMethod.POST)
public ModelAndView assigning(@RequestParam Integer guestid, @RequestParam Integer hotelid) {
    Guest guest = new Guest();
    guest.setId(guestid);
    Hotel hotel = new Hotel();
    hotel.setId(hotelid);
    // 后续原有逻辑不变
}

内容的提问来源于stack exchange,提问作者totta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:36:07