Component#onInitialize is broken for Pages
------------------------------------------
Key: WICKET-3218
URL: https://issues.apache.org/jira/browse/WICKET-3218
Project: Wicket
Issue Type: Bug
Components: wicket
Affects Versions: 1.4.14
Reporter: Carl-Eric Menzel
Attachments: 0001-added-page-onpageinitialize.patch
As first mentioned at
http://mail-archives.apache.org/mod_mbox/wicket-dev/201012.mbox/%[email protected]%3e
, I think the current (Wicket 1.4.14) implementation of Component#onInitialize
is broken for Pages. Pages get initialized as soon as the first component is
added, which is correct. But this usually happens within the constructor of the
page, which means that the page object isn't fully initialized yet. The entire
point of having onInitialize, however, is to be able to do further work once
all constructors have run. See
https://github.com/duesenklipper/wicket-oninitialize for a quickstart that
demonstrates the problem.
Pedro Santos suggested in the above thread to just switch the entire object
construction to onInitialize. I don't think this is a good idea, because
1) it is completely counter-intuitive
2) it is not always realistic to have an entire class hierarchy not using the
constructor just because a subclass somewhere might want to use onInitialize
3) it is inconsistent with onInitialize behavior for all other (non-Page)
components. Here I can easily mix work in the constructor with onInitialize.
I propose the following patch:
- override onInitialize in Page and make it final, so Pages can't use this any
more. This should not cause any unnecessary breaking, since currently it's not
working for pages anyway.
- introduce Page#onPageInitialize to provide a safe alternative to onInitialize
- make a special case for Page in Component's beforeRender to fire
Page#onPageInitialize if necessary
Yes, this is a bit of special casing for Page, but there's quite a lot of that
needed for Page anyway. I think the impact of this should be minimal.
My page includes documentation and a new testcase that verifies the new
behavior. I modified the old ComponentInitializationTest to reflect the fact
that Page doesn't get onInitialize any more.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.