Wicket DropDownChoice salva o objeto no banco de dados, em vez do campo
-
12-12-2019 - |
Pergunta
Estou com um problema ao implementar o dropdownchoice no meu código.Quero exibir uma lista de objetos do tipo ProductCategory.Está tudo bem, mas quando tento salvar o formulário, todo o objeto ProductCategory é salvo, e não apenas o campo do objeto que é exibido na lista de seleção.
Aqui está a aparência do meu código:
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);
O HTML gerado é mais ou menos assim:
<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>
O campo “productCategory” existe em um Objeto do tipo “Produto”, e é do tipo String.
Como tentei descrever;quero salvar ProductCategory.getName() no campo "productCategory" em Produto, e não em todo o objeto ProductCategory.Em outras palavras:Quero salvar "test1" em Product.productCategory, mas em vez disso ele salva com.test.webapp.domain.ProductCategory@1.
Alguém pode dizer como isso é feito?
Qualquer ajuda é muito apreciada.
Solução
Seu problema é que o objeto modelo por trás do ddc é do tipo ProductCategory.Ao salvar, isso será convertido para o tipo String - conforme definido no seu objeto de modelo atrás do formulário.
Eu mudaria o código para ter apenas strings na sua lista de opções.
public List<String> load() {
List<String> pcChoices = new ArrayList<String>();
for(ProductCategory pc : categoryService.findAllProducts()) {
pcChoices.add(pc.getName());
}
return pcChoices;
}
Fazendo isso, você também pode se livrar do renderizador de sua escolha.