How to integrate an old Struts application with Spring 3.x
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.
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, 2022Comments
-
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.