ModelAttribute возвращает нулевые значения в контроллере в Spring MVC

Хорошо, пришло время обратиться за помощью; Я отправляю (покупки) Cart ModelAttribute на свой jsp, позволяя пользователю редактировать количество, когда модель 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[имя=Мое имя], количество=1]], totalCartPrice=10.00]

и после обновления количества с 1 до 3 в jsp и затем POST в контроллер:

CartController.update() Корзина: Корзина [cartDetails=[CartDetail [продукт=null, количество=3]], totalCartPrice=null]

Я прочитал несколько подобных сообщений здесь и на форуме Spring и безуспешно пробовал разные предлагаемые решения. Кажется, что мои отредактированные результаты количества корректно привязываются к Объекту, но почему другие?


person brad12s    schedule 09.09.2014    source источник


Ответы (3)


Предполагая, что у вас есть все необходимые поля в вашем объекте формы;

Вы должны указать поля формы и заполнить значение своими данными.

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

только выведет результат на экран. Если вы хотите привязать его к своей форме, вы должны поместить его в пружинную форму ввода, например:

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

Если вы не хотите, чтобы его можно было редактировать, вы можете поместить его в скрытое поле, но в конце концов вам придется поместить его в элемент формы в jsp и иметь соответствующее поле в вашей форме POJO

person Sezin Karli    schedule 09.09.2014

Кажется, другие поля не связаны, попробуйте связать, например, название продукта

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

Когда-то я потратил много времени на изучение похожего вопроса. Наконец я нашел виновника в методе инициализации Binder:

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

Этот метод устанавливает ограничение на поля, разрешенные для привязки. А все остальные поля не привязаны, что, естественно, приводит к null значениям.

Другая возможная причина: неправильные сеттеры в Bean-компоненте, аннотированном @ModelAttribute. Например, Object setName(String name) вместо void setName(String).

person naXa    schedule 20.03.2015