S2Axisであそぼう
S2RMIで使ったのをS2Axisに換装しようかと思ったけど、まだ何が何やらなんでサンプルで遊びました。
折角なのでSysdeoのTomcatプラグインを使わないで、EclipseのWTPで。いやー慣れないもんだからややこしい。でもいいかもこれ。
パチパチサンプルを実行してて、ノリは同じく、殆ど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のエラーが出るんだよなぁ。まあ中で直接コンテナから取得すればいけるんですが。
再度チャレンジ
うっかりミスだったかも。
例外を投げるメソッドのthrows宣言を
public Book getBook(String isbn) throws AxisFault
ってAxisFaultにしなきゃだめだわ。
で、aspectで例外変換interceptorを突っ込む。実行!
できたぞー!メッセージも取れてる!undeclareExceptionうんたらとか云われないぞ!ちゃんとAxisFaultが来てる!
そっか、throws宣言からWSDDのfaultメッセージを作ってるのか。いやったぜ!
そんな訳でAPI層はバカチョンでLogicクラスに委譲、例外はAOPでAxis用に変換、これでかなり楽になるぞい。
って、API層作るの面倒だからLogicクラスにあたる所をちょこちょこいじってるだけなんで、API層を挟んで後でもう一回検証してみます。