ModelAttribute возвращает нулевые значения в контроллере в Spring MVC
Хорошо, пришло время обратиться за помощью; Я отправляю (Shopping) Cart ModelAttribute на мой jsp, позволяя пользователю редактировать количество, когда Model является POST для контроллера, поля равны нулю, кроме поля editable (amount). Я исследовал подобные проблемы в течение нескольких дней, но ничего не найдено. Я использую весну 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 () Cart: Cart [cartDetails = [CartDetail product=com.Product@c26440 [имя = мое имя], количество =1]], totalCartPrice=10,00]
и после обновления количества от 1 до 3 в jsp и затем POST к контроллеру:
CartController.update () Cart: Cart [cartDetails = [CartDetail [product = null, amount =3]], totalCartPrice=null]
Я прочитал несколько похожих постов здесь и на форуме Spring и безуспешно пробовал разные предлагаемые решения. Кажется, что мои отредактированные количественные результаты правильно привязаны к Объекту, но почему нет других?
3 ответа
Предполагая, что у вас есть все необходимые поля в вашем объекте формы;
Вы должны указать поля формы и заполнить значение своими данными.
<td>${cartDetail.product.name}</td>
будет только распечатать результат на экран. Если вы хотите связать его с вашей формой, вы должны поместить его в форму ввода пружины, такую как:
<form:input path="productName" value="${cartDetail.product.name}"/>
Если вы не хотите, чтобы он был редактируемым, вы можете поместить его в скрытое поле, но в конце концов вам придется поместить его в элемент формы в jsp и иметь соответствующее поле в вашей форме POJO
Кажется, что другие поля не связаны, попробуйте связать, например, название продукта
<td>${cartDetail.product.name}
<form:hidden path="cartDetails[${status.index}].product.name" value="${cartDetail.product.name}"/></td>
Однажды я потратил много времени на изучение подобной проблемы. Наконец я нашел виновника внутри Binder
Метод инициализации:
@InitBinder
void initBinder(final WebDataBinder binder) {
binder.setAllowedFields("name", ...);
}
Этот метод устанавливает ограничение для полей, которые разрешены для привязки. И все остальные поля не связаны, что, естественно, приводит к null
ценности.
Другая возможная причина: неправильные установщики в Бине, аннотированные @ModelAttribute. Например, Object setName(String name)
вместо void setName(String)
,