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
相关产品推荐
相关产品推荐

