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
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