Struts1.3x + Springの連携
ActionにサービスをAutowiringでDIしたいときは通常AutowiringRequestProcessorを使うのですがそうするとStrutsのChainが使えなくなってしまいます。
両方使いたいってときは↓のサイトが参考になります。
CreateActionを継承する場合とActionCommandBaseを継承する場合の2通りの方法があるのですが、ソースがわかり易いという理由で後者を選択しました。
public class AutowireObject extends ActionCommandBase { private Object lockObj = new Object(); private WebApplicationContext webApplicationContext; private int autowireMode; private boolean dependencyCheck; @Override public boolean execute(ActionContext context) throws Exception { synchronized (lockObj) { if (webApplicationContext == null) { ServletActionContext saContext = (ServletActionContext) context; ActionServlet actionServlet = saContext.getActionServlet(); ModuleConfig moduleConfig = context.getModuleConfig(); webApplicationContext = DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig); if (webApplicationContext instanceof ConfigurableApplicationContext) ((ConfigurableApplicationContext) webApplicationContext).getBeanFactory().ignoreDependencyType(ActionServlet.class); autowireMode = DelegatingActionUtils.getAutowireMode(actionServlet); dependencyCheck = DelegatingActionUtils.getDependencyCheck(actionServlet); } } Action action = context.getAction(); if (action != null) webApplicationContext.getAutowireCapableBeanFactory().autowireBeanProperties(action, autowireMode, dependencyCheck); return false; } }
ほぼ上記で紹介されているサイトのまんまです(^^;)
あとはweb.xmlを
: <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>chainConfig</param-name> <param-value>/WEB-INF/chain-config.xml</param-value> </init-param> <init-param> <param-name>spring.autowire</param-name> <param-value>byName</param-value> </init-param> <init-param> <param-name>spring.dependencyCheck</param-name> <param-value>true</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> :
と編集してchain-config.xmlのCreateActionの下に1行追加してやればOKです。
: <command className="org.apache.struts.chain.commands.servlet.CreateAction"/> <command className="jp.co.cac.aag.javaee1.web.struts.AutowireObject"/> :
おかげでStruts + Springの連携まわりがだいぶすっきりしました。