0

ただし、もっと具体的なことを念頭に置いています。

各 Web サービス メソッドは、いくつかのボイラー プレース コードでラップする必要があります (横断的な懸念事項です。はい、Spring AOP はここでうまく機能しますが、機能しないか、政府のアーキテクチャ グループによって承認されていません)。簡単なサービス呼び出しは次のとおりです。

@WebMethod...
public Foo performFoo(...) {

   Object result = null;
   Object something = blah;
   try {
      soil(something);

      result = handlePerformFoo(...);
    } catch(Exception e) {
       throw translateException(e);
    } finally {
       wash(something);
    }
    return result;
}

protected abstract Foo handlePerformFoo(...);

(これで十分なコンテキストであることを願っています)。基本的に、すべてのメソッド呼び出しの周りで汚れ(何か)と洗浄(何か)ができる before() と after() を持つことができるフック(同じスレッドにあった-メソッド呼び出しインターセプターのような)が欲しいおかしなWebメソッド。

私のWebサービスはSpringマネージドBeanではないため、Spring AOPを使用できません:(

ヘルプ!!!!!アドバイスする!その定型文を 10 億回もコピーして貼り付けさせないでください (そうするように指示されています)。

よろしく、LES

4

3 に答える 3

1

Spring がリリースされて以来、AspectJ はオプションですか?

それとも、リフレクションを使用して、アプリケーションを再設計してこの概念に対応できるでしょうか?

リフレクションのレビューについては、次の記事を参照してください: http://onjava.com/pub/a/onjava/2007/03/15/reflections-on-java-reflection.html

または、抽象クラスを使用するようにクラスを再設計して、performFoo が抽象クラスになるようにします。したがって、コピー アンド ペーストを行う必要はありません。あなたはあなたの例でほとんどそこにいます。

于 2009-09-24T01:51:35.937 に答える
0

ハンドラーを使用するのが最善の方法ですが、すべてのサービスにアノテーションを付ける必要があります@HandlerChain

@WebService(name = "AddNumbers")
@HandlerChain(file = "handlers.xml")  // put handlers.xml in WEB-INF/classes
public class AddNumbersImpl implements AddNumbers
{
...
}

ファイルhandlers.xmlは、ハンドラーを定義します。

<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <handler-name>LoggingHandler</handler-name>
      <handler-class>demo.handlers.common.LoggingHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>

最後に、次のようにHandlerクラスを実装します。

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {

   // this is called before invoking the operation and after invoking the operation
   public boolean handleMessage(SOAPMessageContext ctx) {
      log(ctx);
      return true;
   }

   public boolean handleFault(SOAPMessageContext ctx) {
      log(ctx);
      return true;
   }
}

詳細はこちら

于 2010-08-11T18:24:12.277 に答える
0

最終的にJAX-WSCommonsSpring Extentionを使用し、WebサービスにSpringマネージドBeanを実装させ、アドバイスを使用してすべてのボイラープレートを1か所で処理しました。

AOPがないという元の制約を維持したい場合は、次のようにインターフェイスとヘルパーメソッドを作成できたと思います。

interface Operation<T> {
    T execute();
}

public T doOperation(Operation<T> op) {

    // before advice

    try {
        return op.execute();
    } catch(Throwable ex) {
        // handle ...
    } finally {
        // clean up ...
    }
}

最後に、ビジネスメソッドは次のようにコーディングされます。

public Result computeResult(final String item, final int number) {
    return doOperation(new Operation<Result>(){
        public Result execute() {
            return new Result(item + ": processed", number * 5);
        }
    });
}

基本的に、各ビジネスメソッドは、本体にdoOperationヘルパーメソッドを使用し、doOperationメソッドによって作成されたコンテキスト内で実行する必要のあるコードを含む匿名クラスを使用します。このパターンには名前があると思います(ローンパターンを思い出させます)。

于 2010-03-03T04:11:24.777 に答える