Wicket DropDownChoiceは、フィールドの代わりにデータベースにオブジェクトを保存します

StackOverflow https://stackoverflow.com//questions/9667403

質問

私のコードにDropDownChoiceを実装する問題があります。ProductCategory型のオブジェクトのリストを表示します。これはすべて元気で元気ですが、フォームを保存しようとすると、ProductCategoryオブジェクト全体が保存され、選択リストに表示されるオブジェクトからのフィールドだけではありません。

これは私のコードがどのように見えるものです:

    IModel categories = new LoadableDetachableModel() {
        public List<ProductCategory> load() {
            List<ProductCategory> l = categoryService.findAllProducts();
            return l;
        }
    };

    IChoiceRenderer renderer = new IChoiceRenderer() {
        public Object getDisplayValue(Object obj) {
            ProductCategory category = (ProductCategory) obj;
            return category.getName();
        }

        public String getIdValue(Object obj, int index) {
            ProductCategory category = (ProductCategory) obj;
            return category.getName();
        }
    };

    DropDownChoice<ProductCategory> listCategories = new DropDownChoice<ProductCategory>(
            "productCategory",
            categories,
            renderer
    );

    add(listCategories);
.

生成されたHTMLは次のようになります:

<select wicket:id="productCategory" name="productCategory">
    <option selected="selected" value="">Vælg en</option>
    <option value="test1">test1</option>
    <option value="test2">test2</option>
</select>
.

「ProductCategory」フィールドは、 "Product"と型のオブジェクトに存在し、文字列型です。 説明しようとしたように

ProductCategory.GetName()を製品の「ProductCategory」フィールドに保存し、ProductCategoryオブジェクト全体ではありません。 つまり、「TEST1」をProduct1」に保存したいが、代わりにCom.test.WebApp.Domain.productcategory @ 1を保存したい。

誰かがこれがどのように行われるかを教えてください。

あらゆる助けが大いに評価されています。

役に立ちましたか?

解決

あなたの問題はDDCの背後にあるモデルオブジェクトがProductCategory型であることです。保存時に、これはFormの背後にあるモデルオブジェクトで定義されているように、文字列型にキャストされます。

あなたの選択リストに文字列のみを持つようにコードを変更します。

    public List<String> load() {
        List<String> pcChoices = new ArrayList<String>();
        for(ProductCategory pc : categoryService.findAllProducts()) {
            pcChoices.add(pc.getName());
        }
        return pcChoices;
    }
.

そうすることも、あなたはあなたの選択レンダラーを取り除くことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top