0

クラスのセットを RESTful サービスとして公開しているサーバーがあります。クライアントに例外を渡すためにExceptionMapperを使用できることを理解しています。クライアントとサーバー間で共有されるチェック例外はほとんどありません。ただし、一部のサービスでは、クライアント JVM で使用できないチェック例外がほとんどありません。

チェック例外が適切に処理されるようにエンドポイントを変更すると、問題が解決することを理解しています。

しかし、次の 2 つの理由から、インターセプター レイヤーで実行したいと考えています。

  • チェック例外につながるすべての呼び出しを処理できる単一の場所になります。
  • 現在のリリース日のため、これは大きなリファクタリング作業になるでしょう。

CXF documentationを見ると、拡張AbstractPhaseInterceptorしてオーバーライドする必要があることを理解していますhandleMessage()

public class MyOutExceptionInterceptor extends AbstractPhaseInterceptor<Message> {

    public AttachmentInInterceptor() {
        //Which phase to call here ??
        super(Phase.POST_INVOKE);
    }

    public void handleMessage(Message message) {

        //Check from message that it contains an exception of MyCheckedException.class
        //Create an exception that client can understand

    }
}

これを行うにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

1

私は遅れていることを知っていますが、私もこの問題を抱えていて、この解決策を思いつきました。今後の参考のために:

代わりに、内部で handleFault をオーバーライドします。

Exception fault = message.getContent(Exception.class);
Exception exception = fault.getCause();
YourOwnFault newFault = new YourOwnFault("bla bla bla");
message.setContent(Exception.class, newFault);

つまり、フォルトを抽出し、例外を原因として取得し、新しいフォルトを作成して int を挿入します。

于 2013-04-04T14:57:40.067 に答える
0

次のようなものを試してください:

public void handleMessage(Message message) {
 // Map exception
    Exception exception = message.getContent(Exception.class);
    Exception mappedException = mapper.map(exception);

    Fault fault = exception instanceof Fault ? (Fault) exception : null;
    if (fault == null)
    {
        fault = new Fault(exception);
        message.setContent(Exception.class, fault);
     }
    fillInFaultDetails(fault, exception);
}

これは実際にはコードのスニペットです (簡潔にするために、マッピングや詳細の入力は省略しました。重要なことは、メッセージの内容を置き換えることです)。フェーズについては、POST_LOGICAL で実行します。POST_INVOKE も同様に機能する場合があります。

ところで、あなたのユースケースが何であるかはわかりませんが、障害を使用してビジネス例外を伝えるのは好きではありません (私の考えでは、障害はビジネスロジックの例外ではなく、一般的なメッセージ処理エラーを示します.

于 2012-10-04T12:18:16.633 に答える