In the following code:
add(new Button("saveButton")
{
public void onSubmit()
{
//save form values, redirect
@@ Product product = (Product)getModelObject();
ProductProxy.addProduct(product);
setResponsePage(new EditProduct());
}
});
The line marked @@ is wrong. You ask from the submit button the modelobject. Because the button doesn't have a model (model == null), and the form has a compound model, it will use the component id "saveButton" as an OGNL expression with the form modelobject as base.
This happened because you create an anonymous subclass on the Button. The event handler 'onSubmit' has a this pointer to the button.
This can be solved by changing the line to the following:
Product product = (Product)getParent().getModelObject();
Martijn
On 3/20/06, Vincent Jenks <scientifik.com@...> wrote:OK, believe it or not, I did just that and *still* cannot get it to work.
Here's my Form class:
private static class EditProductForm extends Form
{
public EditProductForm(String name, Product product)
{
super(name, new CompoundPropertyModel(product));
//get collection of Category items
IModel catsModel = new LoadableDetachableModel()
{
protected Object load()
{
return ProductProxy.getAllCategories(); //via proxy
}
};
//add form components
add(new TextField("productCode").add(RequiredValidator.getInstance()));
add(new TextField("name").add(RequiredValidator.getInstance()));
add(new TextArea("summary").add( RequiredValidator.getInstance()));
add(new TextArea("description").add(RequiredValidator.getInstance()));
add(new TextField("unitPrice"));
add(new TextField("weight"));
add(new TextField("height"));
add(new TextField("width"));
add(new TextField("length"));
add(new TextField("insuredValue"));
add(new CheckBox("freeShipping"));
add(new TextField("thumbnail").add(RequiredValidator.getInstance()));
add(new TextField("photo").add(RequiredValidator.getInstance ()));
//add reset button
add(new Button("cancelButton")
{
public void onSubmit()
{
setResponsePage(new EditProduct());
}
}.setDefaultFormProcessing(false));
//add reset button
add(new Button("saveButton")
{
public void onSubmit()
{
//save form values, redirect
Product product = (Product)getModelObject();
ProductProxy.addProduct(product);
setResponsePage(new EditProduct());
}
});
}
}
The cancel button works now but the save button is now throwing an exception:
wicket.WicketRuntimeException : Method public abstract void wicket.markup.html.form.IFormSubmitListener.onFormSubmitted () of interface java.lang.reflect.Method threw an exception ...
...
Caused by: java.lang.reflect.InvocationTargetException ...
...
Caused by: wicket.WicketRuntimeException: OGNL Exception: expression='saveButton'; path='4:editProductForm:saveButton'
...
Caused by: ognl.NoSuchPropertyException: com.myapp.model.Product.saveButton
...
Here's the form HTML just in case I'm goofing something there:
<form wicket:id="editProductForm" id="editProductForm">
...
<tr>
<td colspan="2">
<input type="submit" wicket:id="saveButton" value="Save" />
<input type="submit" wicket:id="cancelButton" value="Cancel" />
<br />
<br />
</td>
</tr>
</form>
What's wrong w/ this?
Thanks!