3

我有两个模型:

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 中定义了尺寸,现在我需要创建具有可用尺寸的产品。

我在索引控制器中所做的事情:

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);
    }

问题是我保留了发布的产品,但没有相应的尺寸。

有没有办法在控制器中或直接在模型中保持选定的尺寸?

谢谢。

4

1 回答 1

1

这是一个非常普遍的问题。

要从 post 数据中设置一个List<Size>in Product 实例,即一个带有选定大小的字符串冒号分隔列表,您需要做的就是告诉框架如何将大小转换StringSize实例。最常见的方法是注册 PropertyEditor 一个WebDataBinder

class SizePropertyEditor extends PropertyEditorSupport {

        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            Size size = stringToSize(text);  // write this code
            setValue(size);
        }
}

@InitBinder并使用注解在 Controller 中注册属性编辑器

@InitBinder
public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Size.class, new SizePropertyEditor());

}

有关更通用的方法,请参见ConversionService.

于 2012-12-01T20:29:51.420 回答