A Day In The Life

とあるプログラマの備忘録

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の連携まわりがだいぶすっきりしました。