Wicket DropDownChoice将对象保存到数据库,而不是字段

时间:2012-03-12 12:56:13

标签: java object wicket dropdownchoice

我在代码中实现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”类型的Object中,并且是String类型。

正如我试图描述的那样;我想将ProductCategory.getName()保存到Product中的“productCategory”字段,而不是整个ProductCategory对象。 换句话说:我想将“test1”保存到Product.productCategory,而是保存com.test.webapp.domain.ProductCategory@1。

有人可以告诉我们这是怎么做的吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您的问题是ddc背后的模型对象是ProductCategory类型。在保存时,这将被转换为String类型 - 在表单后面的模型对象中定义。

我会将代码更改为只在您的选择列表中包含字符串。

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

这样做,您也可以摆脱您的选择渲染器。