我有两种模式:
public class Size {
private String name;
// getter and setter
}
public class Product {
private int id;
private String designation;
private Float price;
private List<Size> availableSizes;
// Getter and setters
}
我已经在我的servlet中定义了Sizes,现在我需要创建具有可用大小的产品。
我在索引控制器中的操作:
ModelAndView render = new ModelAndView("admin/index");
render.addObject("products", productFactory.getProducts());
render.addObject("sizes", sizeFactory.getSizes());
render.addObject("command", p);
return render;
我有一份产品清单和我的尺码清单。
在我的索引视图中,我这样做:
<form:form method="post" action="/ecommerce/admin/products" class="form-horizontal">
<form:input path="id" />
<form:input path="designation" />
<form:input path="price" />
<form:select path="availableSizes" items="${sizes}"/>
<input type="submit" value="Ajouter le produit" class="btn" />
</form:form>
然后,在新产品控制器中,我这样做:
// To fix: Sizes not saved !
@RequestMapping(value = "/products", method = RequestMethod.POST)
public ModelAndView newProduct(@ModelAttribute("Product") Product product,
BindingResult result) {
productFactory.add(product);
return buildIndexRender(null, null, product);
}
问题是我记录了发布的产品,但没有相应的尺寸。
有没有办法在控制器中直接在模型中保留选定的尺寸?或者直接在模型中?
感谢。
答案 0 :(得分:1)
这是一个非常普遍的问题。
要在帖子数据中设置产品实例中的List<Size>
,这是一个带有选定大小的字符串冒号分隔列表,您需要做的就是告诉框架如何将大小String
转换为一个Size
个实例。最常见的方法是在PropertyEditor
WebDataBinder
class SizePropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
Size size = stringToSize(text); // write this code
setValue(size);
}
}
使用@InitBinder
注释
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Size.class, new SizePropertyEditor());
}
有关更通用的方法,请参阅ConversionService.