Details
-
Improvement
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
1.4.3, 1.5-M1
-
None
Description
Spring beans fetched from the spring context and injected into wicket components are currently proxied using CGLIB before being injected. These proxies are serializable, as required by the Servlet specification.
However, this proxying puts restrictions on the beans being injected. If CGLIB cannot create the proxy (e.g. if the class to proxy has no default constructor, although there are other scenarios), then this technique does not work. Given that Spring beans can take on many obscure forms (Spring is less restrictive than CGLIB), this means that not all Spring beans can be injected.
The simplest solution to this problem is to allow applications to specify that the injected Spring beans should not be proxied. Clearly, this should not be the default behaviour, since there's no guarantee that Spring beans are properly serializable. However, in many cases the developer knows this not to be an issue, either because they know the Spring beans are serializable (and will not drag half the appcontext along with them in the process), or because they know their container does not serialize sessions. In these situations, non-serializable objects are acceptable.
It is trivial to modify SpringComponentInjector to support this behaviour. See attached patch.