Wicket DropDownChaice salva l'oggetto al database, invece del campo
-
12-12-2019 - |
Domanda
Ho un problema di implementare DropDowiceChaice nel mio codice.Voglio visualizzare un elenco di oggetto di tipo ProductCategory.Questo è tutto bene e va bene, ma quando provo a salvare il modulo, l'intero oggetto ProductCategory viene salvato e non solo il campo dall'oggetto che viene visualizzato nell'elenco Seleziona.
Ecco come è il mio codice:
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);
.
L'HTML generato sembra qualcosa del genere:
<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>
.
Il campo "ProductCategory" esiste in un oggetto di tipo "Prodotto" ed è di tipo String.
come ho provato a descrivere;Voglio salvare ProductCategory.GetName () al campo "ProductCategory" nel prodotto, e non l'intero oggetto ProductCategory. In altre parole: Voglio salvare "Test1" su Product.ProductCategory, ma invece salva com.test.webapp.domain.productCategory@1.
può qualcuno per favore dire come è fatto?
Qualsiasi aiuto è molto apprezzato.
Soluzione
Il tuo problema è che l'oggetto del modello dietro il DDC è di tipo ProductCategory.Su Salva, questo verrà lanciato sul tipo di stringa - come definito nell'oggetto modello dietro il modulo.
cambierei il codice per avere solo stringhe nella tua lista di scelta.
public List<String> load() {
List<String> pcChoices = new ArrayList<String>();
for(ProductCategory pc : categoryService.findAllProducts()) {
pcChoices.add(pc.getName());
}
return pcChoices;
}
.
Fare così, puoi anche sbarazzarti del tuo rendering di scelta.