ActionにCGLIBでAOPを適用する

ActionクラスにSpring AOPを適用する場合、XWorkのInterceptorとの相性とか、なにか問題が発生するのではないか?ということで試してみました。


Actionクラスはインターフェースを定義していないので、SpringのAOPを利用するにはCGLIBを使うことになります(インターフェースを作成した場合にはJDK DynamicProxyでもOK。その場合には画面のレンダリング使うパラメータのSetter/Getterをインターフェースとして公開する定義する必要があります)。
※CGLIBにクラスパスに通しておくのを忘れないように!


結論としては、大きな問題は発生しませんでした。
※ただし@SkipValidationを認識してくれないという問題アリ。


SpringAOPとXWorkを1つのActionに同時に適用するのは危うさを感じますし、またActionはプロトタイプなのでAOP適用のパフォーマンスが心配です。出来る限りActionにSpringAOPを使うのは避けたほうがよいと思いました。


なお、SpringのBean定義ファイルにproxy-target-class="true"を忘れると、以下のような例外が発生します。スタックトレースの内容からは、Springの設定に問題があることが判断しずらいので要注意。

java.lang.IllegalArgumentException: The list() is not defined in action class $Proxy13
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction (DefaultActionInvocation.java:407)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly (DefaultActionInvocation.java:262)
com.opensymphony.xwork2.DefaultActionInvocation.invoke (DefaultActionInvocation.java:224)
com.opensymphony.xwork2.interceptor.TimerInterceptor.invokeUnderTiming (TimerInterceptor.java:125)
com.opensymphony.xwork2.interceptor.TimerInterceptor.intercept (TimerInterceptor.java:112)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling (DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling (DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile (UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke (DefaultActionInvocation.java:216)
org.apache.struts2.impl.StrutsActionProxy.execute (StrutsActionProxy.java:50)
org.apache.struts2.dispatcher.Dispatcher.serviceAction (Dispatcher.java:507)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter (FilterDispatcher.java:421)