How to integrate an old Struts application with Spring 3.x

14,779

Solution 1

Use ContextLoaderPlugin and set the struts controller to the processorClass "AutowiringRequestProcessor" like this (in struts-config.xml):

<controller>
    <set-property property="processorClass" value="org.springframework.web.struts.AutowiringRequestProcessor" />
</controller>

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/config/action-servlet.xml"/>
</plug-in>

action-servlet.xml has to be an empty beans context file:

<beans></beans>

Add the following init parameter to the ActionServlet in web.xml:

<init-param>
    <param-name>autowire</param-name>
    <param-value>byName</param-value>
</init-param>

Just write regular struts actions, and add the annotation "@Component" to every action so that spring will discover the actions and creates a bean out of it. The "AutowiringRequestProcessor" will find the right bean that matches the action class defined in your struts-config.xml.

It's now also possible to have other beans injected into you Action class with @Autowired on setter(s).

Solution 2

You can use the ApplicationContextAware interface to have a utility class have access to the ApplicationContext.

public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    public static Object getSpringBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

    public void setApplicationContext(ApplicationContext appContext)
        throws BeansException {
        applicationContext = appContext;
   }
}

You can then access the static method from your Action class.

public class MyAction extends LookupDispatchAction {
    private MyService getMyService() {
        return (MyService) SpringUtil.getSpringBean("myService");
    }
}

Not the most elegant solution, but it works.

Solution 3

Use ContextLoaderPlugIn. Deprecated in Spring 3.0, but still there.

I used it with Struts 1.x and Spring 2.5.x - it worked beautifully. This integration approach allows to inject Spring beans directly into Struts actions, which is pretty clean and straightforward.

Share:
14,779
Marco
Author by

Marco

Happy coder, system architect, software geek, cloud believer, tech guy, open-source enthusiasts, wannabe cooking chef, likes to travel, meet new people, share knowledge, and watch movies/series.

Updated on June 04, 2022

Comments

  • Marco
    Marco about 2 years

    i was wondering how to and what the prefered way of integrating an Struts 1.x application with Spring 3.x so we can benefit from the IOC stuff.