3

私は2つのモデルを持っています:

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
}

サーブレットでサイズを定義しましたが、使用可能なサイズの製品を作成する必要があります。

インデックスコントローラーで行うこと:

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

これは非常に一般的な問題です。

投稿データからinProductインスタンスを設定するList<Size>には、つまり、選択したサイズの文字列コロンで区切られたリストを設定するには、フレームワークにサイズ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アノテーションを使用してプロパティエディタをコントローラに登録します

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

}

より一般的なアプローチについては、を参照してください。ConversionService.

于 2012-12-01T20:29:51.420 に答える