S2Axisであそぼう

S2RMIで使ったのをS2Axisに換装しようかと思ったけど、まだ何が何やらなんでサンプルで遊びました。

折角なのでSysdeoのTomcatプラグインを使わないで、EclipseWTPで。いやー慣れないもんだからややこしい。でもいいかもこれ。

パチパチサンプルを実行してて、ノリは同じく、殆どWEBサービスである事を感じさせない作り。WSDDを使うサンプルもありましたが、折角のS2なので見なかった事にする。

サンプルのex02で、2回目の実行でテストがコケるのはちょっとうろたえましたが。そりゃそうだ、サーバ側がシングルトンだもんなあ。

例外どうするよ

で、気になったのは例外の扱いなんですけどね。

AxisでSOAP使って例外をキャッチするには、AxisFaultってのを継承した例外クラスを作らなきゃいけないんですよ。

WEB側はWEB側で、基本の作りは普通のHTMLベースと同じく、RuntimeExceptionでエラーメッセージを取り回したい。でもそれだとクライアント側でキャッチ出来ない。

いや、キャッチは出来るんだけど、サーバ側で設定したエラーメッセージが取れないんですな。大体がメッセージ、AxisFault#getFaultString()なんてメソッド使うし。

そうなると、以前MTASC実験の時に考えた、HTMLベースじゃなきゃActionクラス要らないんじゃないの?Logicクラス直接呼出しで良いんじゃないの?ってのは御破算ですね。

いや、Logicクラス内でAxisFaultを投げる仕様にすりゃいいんですけど、そうなるとAxisに特化されすぎちゃってどうにも気持ち悪い。そもそもが、HTMLでカスタマー向け注文サイト、WEBサービスでリッチクライアントによる濃いお仕事の2本立てで、業務ロジックを共有したいってのがWEBサービス検討の始まりだった訳で。

因みに以前の案件ではWEBとC/S二本立てで、DBだけ一緒で業務ロジック分散しまくりでした。今の所大きいメンテや業務要件変更がないからいいんだけど、ああこはい。知ーらないっと。

でもきっと火消しが回ってくる。ああ。

で、id:habuakihiroさんがコメントしてくだすったように、やはりプラットフォームごとにActionみたいなAPI層を設けるってのが正しいのかも知れません。

そこでAOPですよ!かっ?

「なんちゃらAxisAction」みたくAPI層を作るとしてだよ、一個一個でいちいち例外をAxisFaultに振り替えるの、難儀かも知れないなーとか思ったりして。

そこで、ひらめきましたね俺は。ThrowsInterceptorでRuntimeException捕まえて振り替えちゃえばいいんだよ。*AxisActionって奴にaspectでガンガン突っ込む。これだぜ!AOP万歳!

import org.aopalliance.intercept.MethodInvocation;
import org.apache.axis.AxisFault;
import org.seasar.framework.aop.interceptors.ThrowsInterceptor;

public class ExceptionToAxisFaultInterceptor extends ThrowsInterceptor {

     public void handleThrowable(RuntimeException t, MethodInvocation invocation)
     throws Throwable {
        throw new AxisFault(t.getMessage());
    }

}

こんな感じ。いざ実行!

だめでした。がびーん。

S2AxisのWSDDの自動生成でAxisFaultを見てくれなきゃだめなのよね、多分・・・・。インターセプタまで追っかけてみてくれるわけないよなあ。

まとめ

  • Axis用のActionクラスみたいなのを作るべし
    • Axisしか使わないシステムならLogicで最初からAxisFault投げてもいいと思う
    • でも好みじゃないなあ
  • 例外をThrowsInterceptorでAxisFaultに変換するのはやめよう

さて、問題はSwingから上手い事つながるかだなぁ。diconファイル通してコンテナ任せでインジェクションすると、AWTのエラーが出るんだよなぁ。まあ中で直接コンテナから取得すればいけるんですが。