[Struts2] Actionメソッドをフックする(@Before, @After, @BeforeResult)

Struts2では複数のアクションを1つのActionに記述できるので、TemplateMethodパターンではメソッドの前処理と後処理を書けません(Struts1では、Actionごとにメソッドが1つだったので、TemplateMethodパターンを利用して簡単にActionメソッドをフックできる)。


Struts2では、@Before, @After, @BeforeResultを使って、Actionのフックメソッドを定義できます。

@Before
public void prepareAction() {
  // ...
}

これらのアノテーションを利用するには、AnnotationWorkflowInterceptorをinterceptorStackに追加する必要があります(Defaultではないので自分で追加します)。個々のAction定義に記述してもよいですが、アプリケーションのデフォルトパッケージとして定義したほうが使いやすいと思います。

<struts>
  <include file="struts-default.xml" />

  <package name="myapp-default" extends="struts-default" abstract="true" >

    <interceptors>
      <interceptor name="annotationWorkflow"
       class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />

      <interceptor-stack name="myapp-defaultStack">
        <interceptor-ref name="defaultStack" />
        <interceptor-ref name="annotationWorkflow" />
      </interceptor-stack>
    </interceptors>
    
    <default-interceptor-ref name="myapp-defaultStack" />
  </package>

  <include file="struts/struts-order.xml" />

</struts>

なお、@Before, @After以外にActionをフックする方法としては、以下が考えられます。

  • Interceptorを実装する
  • Prepareインターフェースを利用する(前処理のみ)
  • AOPを適用する



参考