11

私はRESTプロバイダーとしてApachCXFを使用しています。

Webサービスに入るときにデータを収集し、応答に入る前にデータを収集して、応答に計算を追加したいと思います。この質問と簡単にするために、入力の開始時刻、応答が送信される前の終了時刻を取得し、合計時間を応答に追加したいとします。

さて、どうすればいいですか?単独で正常に機能するInおよびOutインターセプターを作成しましたが、OutインターセプターでInインターセプターからのデータを使用するにはどうすればよいですか?

ありがとうIdob



アップデート:

データをコンテキストパラメータとして設定しようとしました

message.setContextualProperty(key,value);

しかし、私はNULLを取得しています

message.getContextualProperty(key);

私も同じことを試しましたが、

message.put(key,value) and message.get(key)

動作しませんでした。

アイデアは誰ですか?

ありがとう、イドブ

4

2 に答える 2

29

に値を保存できますExchange。CXFは、Exchangeリクエストごとにオブジェクトを作成して、リクエストとレスポンスのペアのインメッセージとアウトメッセージのコンテナとして機能し、message.getExchange()両方からアクセスできるようにします。

迎撃機:

public void handleMessage(Message inMessage) throws Fault {
  inMessage.getExchange().put("com.example.myKey", myCustomObject);
}

アウトインターセプター

public void handleMessage(Message outMessage) throws Fault {
  MyCustomObject obj = (MyCustomObject)outMessage.getExchange().get("com.example.myKey");
}

(または、クライアント側インターセプターの場合はその逆で、outは値を格納し、inは値を取得します)。他のインターセプターによって使用されないことがわかっているキーを選択してください。パッケージ修飾名が適切な選択です。Messageのように、Exchangeはであり、コンパイル時の型の安全性を提供し、キャストする必要をなくすキーとしてStringMapaをとる一般的なput/getメソッドがあることに注意してください。Class

theExchange.put(MyCustomObject.class, new MyCustomObject());
MyCustomObject myObj = theExchange.get(MyCustomObject.class);
于 2012-10-02T12:50:32.813 に答える
1

インターセプターはにアクセスできますjavax.xml.ws.handler.MessageContext。これは拡張Map<String,Object>されるので、必要なものをコンテキストに入れて、後でリクエストでアクセスできます。

public boolean handleMessage(final MessageContext context) {
    context.put("my-key", myCustomObject);
            // do whatever else your interceptor does
}

後で:

public boolean handleMessage(final MessageContext context) {
    MyCustomObject myCustomObject = context.get("my-key");
            // do whatever else your interceptor does
}
于 2012-10-02T10:03:13.760 に答える