Hi,
 
I had a look at the Spring integration approaches of Wicket. It would
be nice, if the Spring ApplicationContext is not only available from a
custom subclass of Wickets HttpApplication as proposed so far. The
adoption of your framework would be higher with a good and more
transparent Spring framework integration.
So I want to share my considerations:
- Wicket pages a Spring managed beans 
    => I think this is problematic by now because most often the
default constructor of a Wicket page isn't used by the Wicket framework,
but one of the other constructors (e.g. the one passing PageParameters).
For Spring management the default constructor would be needed, as I can
see so far.
 
- Automatic injection of the ApplicationContext in a Wicket page, so
that I don't have to query for the ApplicationContext: 
    => I tried it like this:
    1.) A Wicket page interested in the ApplicationContext implements
the org.springframework.context.ApplicationContextAware interface
    2.) Provide the subclass SpringPageFactory:
 
public class SpringPageFactory extends PageFactory implements
ApplicationContextAware {
    
    private ApplicationContext springContext = null;
    
    public ApplicationContext getSpringContext() {
        return springContext;
    }
 
    public void setSpringContext(ApplicationContext springContext) {
        this.springContext = springContext;
    }
    
    public void setApplicationContext(ApplicationContext
applicationContext) {
        this.springContext = applicationContext;
    }
    
    /**
     * Constructor
     *
     * @param application The application object
     */
    public SpringPageFactory(final IApplication application) {
        super(application);
    }
    
    protected Page newPage(final Constructor constructor, final Object
parameter) {
        Page newPage = super.newPage(constructor, parameter);
        Class[] interfaces = newPage.getClass().getInterfaces();
        if( interfaces != null ) {
            for( int i=0; i<interfaces.length; i++ ) {
                if( interfaces[i] == ApplicationContextAware.class ) {
                    ((ApplicationContextAware)
newPage).setApplicationContext(springContext);
                }
            }
        }
        return newPage;
    }
}

 
    3.) Configure the wiring:
 <bean id="wicketController"
class="wicket.examples.springframework.SpringApplicationController">
         <property name="application"><ref
local="wicketApp"/></property>
 </bean>
 
 <bean id="wicketApp" class="WicketApp">
         <property name="settings"><ref
local="wicketSettings"/></property>
 </bean>
 
 <bean id="wicketSettings" class="wicket.ApplicationSettings">
      <constructor-arg><ref local="wicketApp"/></constructor-arg>
      <property name="pageFactory"><ref
local="pageFactory"/></property>
 </bean>
 <bean id="pageFactory" class="de.bluvo.wicket.SpringPageFactory">
           <constructor-arg><ref local="wicketApp"/></constructor-arg>
 </bean>

The disadvantage of this approach is, that I cannot access the
ApplicationContext in the constructor without querying for it, because
the ApplicationContext will first be injected after the constructor is
called.
 
Martin
 
 


-------------------------------------------------------
The SF.Net email is sponsored by: Beat the post-holiday blues
Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek.
It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt
_______________________________________________
Wicket-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to