Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-3936

Extend SpringBean annotation to configure proxy creation by boolean attribute proxy

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.4.17
    • None
    • wicket-spring
    • None
    • Windows, Wicket 1.4.17

    Description

      i would like to decouple the page dependencies. My page flow is implemented by using bookmarkable page links.
      As we all know they take a page class as parameter. This couples both pages.

      So i thought it's a good idea to give the page class a name in my Spring application context and reference it in
      the caller page.

      <code>
      public StartPage extends WebPage {

      @SpringBean(name="nextPageClass")
      private Class<? extends Page> _nextPageClass;

      public StartPage()

      { add(new BookmarkablePageLink("toNextPage", _nextPageClass); }

      }
      </code>

      My application context defines:

      <code>
      <bean id="nextPageClass" class="java.lang.Class" factory-method="forName">
      <constructor-arg value="my.NextPage"/>
      </bean>
      </code>

      But it's not working while java.lang.Class is final. I get

      Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class java.lang.Class
      at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
      at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
      at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
      at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
      at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
      at org.apache.wicket.proxy.LazyInitProxyFactory.createProxy(LazyInitProxyFactory.java:174)
      at org.apache.wicket.spring.injection.annot.AnnotProxyFieldValueFactory.getFieldValue(AnnotProxyFieldValueFactory.java:130)
      at org.apache.wicket.injection.Injector.inject(Injector.java:103)
      ... 47 more

      I worked around this by setting wrapWithProxies to false in Application.inits
      <code>
      addComponentInstantiationListener(new SpringComponentInjector(this, context(), false));
      </code>

      But this way i can set the behavior only globally. The consequences are that all my daos and services have to be serializable.

      It would be nice if SpringBean could be configured to use wrapInProxy or not (Martin G. suggested this). Default could be true so no
      behavior change occurs.

      Attachments

        1. springBeanProxy14.txt
          6 kB
          Andrea Del Bene
        2. springBeanProxy.txt
          5 kB
          Andrea Del Bene

        Activity

          People

            Unassigned Unassigned
            newgro Per Newgro
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: