2014-09-09 4 views
4

Хорошо, пришло время обратиться за помощью; Я отправляю (Shop) Cart ModelAttribute на мой jsp, позволяя пользователю редактировать количество, когда модель является POST для контроллера, поля являются нулевыми, за исключением поля редактируемого (количества). Я исследовал дни по аналогичным вопросам, но ничто не соответствует. Я использую весной 3.1.ModelAttribute возвращает значения null в контроллере весной MVC

Вот мой контроллер на 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"; 
     } 

и POST

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

и журнал результатов для телегу на ГЭТ:

CartController.showCart() Корзина: Корзина [cartDetails = [CartDetail [email protected] [имя = My Name], количество = 1]], totalCartPrice = 10,00]

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

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

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

ответ

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.Например, Object setName(String name) вместо void setName(String).

Смежные вопросы