ModelAttribute 在 Spring MVC 的控制器中返回空值

问题描述 投票:0回答:3

我正在向我的 jsp 发送一个(购物)购物车 ModelAttribute,允许用户编辑数量,当模型 POST 到控制器时,除了可编辑(数量)字段之外,其他字段均为空。我已经研究了几天类似的问题,但没有任何匹配。我正在使用 spring 3.1.

这是我的 GET 和 POST 控制器:

@Controller
public class CartController {

      @Autowired
      private Cart cart;        

      @RequestMapping(value = "/cart", method = RequestMethod.GET)  
      public String showCart(Model model) {
         logger.debug("CartController.showCart() Cart: {}", this.cart);
         model.addAttribute(cart);
         return "cart/cart";
      }

并发布

   @RequestMapping(value = "/cart", method = RequestMethod.POST, params = "update")
   public String update(@ModelAttribute("cart") Cart cart, BindingResult result, Model model) {
      logger.debug("CartController.update() Cart: {}", cart); 
      return "cart/cart";
   }

我的jsp:

<div class="container MainContent">
   <form:form method="POST" modelAttribute="cart">
      <fieldset>
         <legend>Cart</legend>
         <table class="table">
            <thead>
               <tr>
                  <th>Product Name</th>
                  <th>Quantity</th>
                  <th>Product Price</th>
               </tr>
            </thead>
            <tbody>
               <c:forEach items="${cart.cartDetails}" var="cartDetail" varStatus="status">
                  <tr>
                     <td>${cartDetail.product.name}</td>                     
                     <td><form:input path="cartDetails[${status.index}].quantity" size="1" /></td>                     
                     <td>${cartDetail.price}</td>
               </c:forEach>
               <tr>
                  <b><td colspan="2" align="right"><spring:message code="order.total" /></b>
                  </td>
                  <td>${cart.totalCartPrice}</td>
               </tr>
            </tbody>
         </table>
      </fieldset>
      <div></div>
      <button id="order" name="order">
         <spring:message code="button.order" />
      </button>
      <button id="update" name="update">
         <spring:message code="button.update" />
      </button>
   </form:form>
</div>

以及 GET 之前购物车的日志结果:

CartController.showCart() 购物车:购物车 [cartDetails=[CartDetail 产品=com.Product@c26440[名称=我的名字], 数量=1]],总购物车价格=10.00]

在jsp中将数量从1更新为3后,然后POST到控制器:

CartController.update() 购物车:购物车 [cartDetails=[CartDetail [产品=空,数量=3]],totalCartPrice=空]

我在这里和 Spring 论坛上阅读了几篇类似的文章,并尝试了不同的建议解决方案,但没有成功。看起来我编辑的数量结果已正确绑定到对象,但为什么其他结果没有?

spring jsp spring-mvc modelattribute
3个回答
4
投票

假设您的 Form 对象中有所有必需的字段;

您必须指定表单字段并用您的数据填充值。

<td>${cartDetail.product.name}</td> 

只会将结果打印到屏幕上。如果您想将其绑定到您的表单,您必须将其放入弹簧表单输入中,例如:

<form:input path="productName"  value="${cartDetail.product.name}"/> 

如果您不希望它可编辑,那么您可以将其放入隐藏字段中,但最终您必须将其放入jsp中的表单元素中,并在表单POJO中拥有相应的字段


2
投票

好像其他字段没有绑定,尝试绑定例如产品名称

<td>${cartDetail.product.name}
<form:hidden path="cartDetails[${status.index}].product.name" value="${cartDetail.product.name}"/></td>

0
投票

我曾经花了很多时间调查类似的问题。最后我在

Binder
的初始化方法中找到了罪魁祸首:

@InitBinder
void initBinder(final WebDataBinder binder) {
    binder.setAllowedFields("name", ...);
}

此方法对允许绑定的字段设置限制。所有其他字段都未绑定,自然会产生

null
值。

另一个可能的原因:用@ModelAttribute注释的Bean中的setter不正确。例如,

Object setName(String name)
而不是
void setName(String)

© www.soinside.com 2019 - 2024. All rights reserved.