You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Andreas Lundblad <an...@gmail.com> on 2014/12/17 23:14:44 UTC
Strange behavior of FormComponentBehavior
I'm experiencing the strangest behavior with a FormComponentPanel.
My custom FormComponentPanel has the following method:
@Override
protected void convertInput() {
CountryImpl c = new CountryImpl(countryId,
name.getConvertedInput(),
currency.getConvertedInput(),
flag.getConvertedInput());
System.err.println("Setting converted input: " + c + " (identity: "
+ System.identityHashCode(c) + ")");
setConvertedInput(c);
}
Upon form submission I get the following printout on System.err:
Setting converted input: CountryImpl[id: 53b2c7a0986c5f4527783d16, name:
Sweden, currency: SEK, flag: ImageImpl[id=543d4328e4b0524ccbf143f8,
data.length=13452]] (identity: 1113118053)
Which is exactly what I expect. Great. Now to the part I can't explain:
In the Form that encloses this FormComponentPanel, I have the following
code:
(
@Override
public void onSubmit() {
Country country = countryPanel.getModelObject();
System.err.println("country from
countryPanel.getModelObject(): " + country + " (identity: " +
System.identityHashCode(country) + ")");
...
}
And upon submit I get the following output:
country from countryPanel.getModelObject(): CountryImpl[id:
53b2c7a0986c5f4527783d16, name: Sweden, currency: SEK, flag: ImageRef[id:
543d4328e4b0524ccbf143f8]] (identity: 1025123013)
As you can see, the countryPanel.getModelObject() does not match the object
that I used in setConvertedInput! (By looking at the
System.identityHashCode one can see that they are not the same object.) Why
is this? This is how I've always done!
Other (strange) observations:
- If I change one of the text-fields (name or currency) it works as
expected! I get the same object out from getModelObject as I give to
setConvertedInput
- If I instead of countryPanel.getModelObject() do
countryPanel.getConvertedInput() I get the expected object. (In [1]
however, it says I should use getModelObject()
I've stepped through the Wicket form processing code but it's really
complex and I can't determine where it goes wrong. I have other custom
components (seemingly identical to the CountryPanel) that works as expected.
Any suggestions on what may be the issue is welcome. (I would hook you up
with a minimal test case if I could, but I can't reproduce this when
writing from scratch. Some detail seems to evade me.)
best regards,
Andreas Lundblad
[1]
https://cwiki.apache.org/confluence/display/WICKET/Creating+Custom+FormComponentPanel%27s+to+build+valid+objects+using+Wicket%27s+Form+Validation+Logic
Re: Strange behavior of FormComponentBehavior
Posted by Martin Grigorov <mg...@apache.org>.
Hi,
It looks
like org.apache.wicket.markup.html.form.FormComponent#updateModel() is not
called for the FormComponentPanel.
Usually this happens when there is an error in the validation. But since
#onSubmit() is called then the validation should have been passed,
otherwise #onError() should have been called.
Put a breakpoint at
https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java#L913
and see whether it goes down to
https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java#L945
Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov
On Thu, Dec 18, 2014 at 12:14 AM, Andreas Lundblad <
andreas.lundblad@gmail.com> wrote:
>
> I'm experiencing the strangest behavior with a FormComponentPanel.
>
> My custom FormComponentPanel has the following method:
>
> @Override
> protected void convertInput() {
> CountryImpl c = new CountryImpl(countryId,
> name.getConvertedInput(),
> currency.getConvertedInput(),
> flag.getConvertedInput());
> System.err.println("Setting converted input: " + c + " (identity: "
> + System.identityHashCode(c) + ")");
> setConvertedInput(c);
> }
>
> Upon form submission I get the following printout on System.err:
>
> Setting converted input: CountryImpl[id: 53b2c7a0986c5f4527783d16, name:
> Sweden, currency: SEK, flag: ImageImpl[id=543d4328e4b0524ccbf143f8,
> data.length=13452]] (identity: 1113118053)
>
> Which is exactly what I expect. Great. Now to the part I can't explain:
>
> In the Form that encloses this FormComponentPanel, I have the following
> code:
> (
> @Override
> public void onSubmit() {
> Country country = countryPanel.getModelObject();
>
> System.err.println("country from
> countryPanel.getModelObject(): " + country + " (identity: " +
> System.identityHashCode(country) + ")");
> ...
> }
>
> And upon submit I get the following output:
>
> country from countryPanel.getModelObject(): CountryImpl[id:
> 53b2c7a0986c5f4527783d16, name: Sweden, currency: SEK, flag: ImageRef[id:
> 543d4328e4b0524ccbf143f8]] (identity: 1025123013)
>
> As you can see, the countryPanel.getModelObject() does not match the object
> that I used in setConvertedInput! (By looking at the
> System.identityHashCode one can see that they are not the same object.) Why
> is this? This is how I've always done!
>
> Other (strange) observations:
>
> - If I change one of the text-fields (name or currency) it works as
> expected! I get the same object out from getModelObject as I give to
> setConvertedInput
> - If I instead of countryPanel.getModelObject() do
> countryPanel.getConvertedInput() I get the expected object. (In [1]
> however, it says I should use getModelObject()
>
> I've stepped through the Wicket form processing code but it's really
> complex and I can't determine where it goes wrong. I have other custom
> components (seemingly identical to the CountryPanel) that works as
> expected.
>
> Any suggestions on what may be the issue is welcome. (I would hook you up
> with a minimal test case if I could, but I can't reproduce this when
> writing from scratch. Some detail seems to evade me.)
>
> best regards,
> Andreas Lundblad
>
> [1]
>
> https://cwiki.apache.org/confluence/display/WICKET/Creating+Custom+FormComponentPanel%27s+to+build+valid+objects+using+Wicket%27s+Form+Validation+Logic
>
Re: Strange behavior of FormComponentBehavior
Posted by andrea del bene <an...@gmail.com>.
Hi Andreas,
what is the type of the model object for "flag" component? I see that
inside convertInput is a ImageImpl while inside onSubmit is ImageRef
> I'm experiencing the strangest behavior with a FormComponentPanel.
>
> My custom FormComponentPanel has the following method:
>
> @Override
> protected void convertInput() {
> CountryImpl c = new CountryImpl(countryId,
> name.getConvertedInput(),
> currency.getConvertedInput(),
> flag.getConvertedInput());
> System.err.println("Setting converted input: " + c + " (identity: "
> + System.identityHashCode(c) + ")");
> setConvertedInput(c);
> }
>
> Upon form submission I get the following printout on System.err:
>
> Setting converted input: CountryImpl[id: 53b2c7a0986c5f4527783d16, name:
> Sweden, currency: SEK, flag: ImageImpl[id=543d4328e4b0524ccbf143f8,
> data.length=13452]] (identity: 1113118053)
>
> Which is exactly what I expect. Great. Now to the part I can't explain:
>
> In the Form that encloses this FormComponentPanel, I have the following
> code:
> (
> @Override
> public void onSubmit() {
> Country country = countryPanel.getModelObject();
>
> System.err.println("country from
> countryPanel.getModelObject(): " + country + " (identity: " +
> System.identityHashCode(country) + ")");
> ...
> }
>
> And upon submit I get the following output:
>
> country from countryPanel.getModelObject(): CountryImpl[id:
> 53b2c7a0986c5f4527783d16, name: Sweden, currency: SEK, flag: ImageRef[id:
> 543d4328e4b0524ccbf143f8]] (identity: 1025123013)
>
> As you can see, the countryPanel.getModelObject() does not match the object
> that I used in setConvertedInput! (By looking at the
> System.identityHashCode one can see that they are not the same object.) Why
> is this? This is how I've always done!
>
> Other (strange) observations:
>
> - If I change one of the text-fields (name or currency) it works as
> expected! I get the same object out from getModelObject as I give to
> setConvertedInput
> - If I instead of countryPanel.getModelObject() do
> countryPanel.getConvertedInput() I get the expected object. (In [1]
> however, it says I should use getModelObject()
>
> I've stepped through the Wicket form processing code but it's really
> complex and I can't determine where it goes wrong. I have other custom
> components (seemingly identical to the CountryPanel) that works as expected.
>
> Any suggestions on what may be the issue is welcome. (I would hook you up
> with a minimal test case if I could, but I can't reproduce this when
> writing from scratch. Some detail seems to evade me.)
>
> best regards,
> Andreas Lundblad
>
> [1]
> https://cwiki.apache.org/confluence/display/WICKET/Creating+Custom+FormComponentPanel%27s+to+build+valid+objects+using+Wicket%27s+Form+Validation+Logic
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org