【问题标题】:ModelAttribute returns null values in controller in Spring MVCModelAttribute 在 Spring MVC 的控制器中返回空值
【发布时间】:2014-11-03 06:23:23
【问题描述】:

好的,是时候寻求帮助了;我正在向我的 jsp 发送(购物)购物车 ModelAttribute,允许用户编辑数量,当模型 POST 到控制器时,除了可编辑(数量)字段外,其他字段为空。我已经研究了几天类似的问题,但没有什么是匹配的。我正在使用弹簧 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 product=com.Product@c26440[name=我的名字], 数量=1]],totalCartPrice=10.00]

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

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

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

【问题讨论】:

    标签: spring jsp spring-mvc modelattribute


    【解决方案1】:

    假设您的表单对象中有所有必要的字段;

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

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

    只会将结果打印到屏幕上。如果你想将它绑定到你的表单,你必须把它放在一个 spring 表单输入中,例如:

    <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>
      

      【讨论】:

        【解决方案3】:

        我曾经花了很多时间调查一个类似的问题。终于在Binder的初始化方法里面找到了罪魁祸首:

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

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

        另一个可能的原因:使用 @ModelAttribute 注释的 Bean 中的设置器不正确。例如,Object setName(String name) 而不是 void setName(String)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          • 2018-01-03
          • 1970-01-01
          • 2014-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多