【发布时间】:2014-08-09 18:03:11
【问题描述】:
我有一个实体Order,其中包含另一个实体OrderType,如下:
public class Order {
private int id;
private Date requestDate;
private OrderType orderType;
}
public class OrderType {
private int id;
private String name;
}
我有一个 JSP 页面,用户可以在其中编辑现有订单以更改日期或类型:
<form:form method="post" commandName="order">
<table border="0">
<tr>
<td>Order Type:</td>
<td><form:select path="orderType"><form:options items="${orderTypes}" itemValue="id" itemLabel="name" /></form:select></td>
<td><form:errors path="orderType" /></td>
</tr>
<tr>
<td>Date:</td>
<td><form:input path="requestDate" /></td>
<td><form:errors path="requestDate" /></td>
</tr>
</table>
</form:form>
我的控制器非常简单:
@RequestMapping(value="/edit/{id}", method = RequestMethod.GET)
public String getOrder(@PathVariable("id") short id, Map<String, Object> map) throws ParseException {
Order order = orderService.getOrder(id);
List<OrderType> orderTypes = OrderTypeService.getAllOrderTypes();
map.put("order", order);
map.put("orderTypes", orderTypes);
return "EditOrder";
}
@RequestMapping(value="/edit/{id}", method = RequestMethod.POST)
public String editOrder(@PathVariable("id") short id, @Valid @ModelAttribute("order") Order order, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "EditOrder";
} else {
order.setId(id);
orderService.updateOrder(order);
return "redirect:/orders/";
}
}
我的问题是,当 JSP 页面加载时,下拉菜单总是设置为列表中的第一项,而不是正确的一项。页面的其余部分工作正常(即正确的值在表单提交时被持久化到数据库中并且弹簧验证工作正常)。
如果我将<form:select path="orderType"> 更改为<form:select path="orderType.id">,下拉菜单会设置为正确的值,但这会在表单提交时出现错误,因为 orderType 为空。我将不胜感激。
【问题讨论】:
-
它可能不起作用,但您可以尝试向
OrderType添加一个equals(和相应的hashCode)方法,该方法将使用这两个字段来确定相等性。让我知道进展如何:)