0

JAX-RS / Apache CXFJSONを使用してクライアントサーバーアプリを開発しています

Apache CXFで例外を両端で透過的に処理する必要があります。つまり、例外をBeanに変換し、Jackson Serializer(JSON)でシリアル化してから、クライアント側で処理をやり直します。

私はこの主題に関するいくつかの紛らわしい投稿/回答を見て、@WebFaultアノテーションを使用することを思いつきました:

@WebFault(name=CODE, faultBean="foo.bar.FaultBean")
public class DuplicateRuleNameFault extends Exception {
   static final public String CODE = "DUPLICATE_RULE_NAME";
   private FaultBean faultBean;

   public DuplicateRuleNameFault(String msg) {
     super(msg);
     this.faultBean = new FaultBean(msg);
   }
   public DuplicateRuleNameFault() {
   }
   public FaultBean getFaultBean() {
     return faultBean;
   }
   public void setFaultBean(FaultBean faultBean) {
     this.faultBean = faultBean;
   }
}

成功しませんでした...現在、CXFは例外の注釈を喜んで無視し、それを不明な例外として処理しているようです:500ステータスエラーとサーバー側で生成された応答本文はありません。

Springコンテキストの""サーバー要素で構成する必要がある特定の何かがありますか?私はすでにSpringにException/FaultBeanクラスをスキャンさせています(ところで必要なのですか?)。

いくつかの実例を教えていただければ幸いです。ありがとう。

4

2 に答える 2

3

@WebFault'sJAX-RS仕様の一部ではありません。仕様のセクション3.3.4を読んでください。このセクションでは、実行しようとしていることを実行するためのさまざまな方法について説明しています。

オプション1

WebApplicationExceptionをスローするようにリソースクラスを設計します。これらの例外のプロパティを、クライアントに送信する障害Beanを含む有効なJAX-RS応答に設定responseします。

オプション2

例外マッピングプロバイダーを定義します。これらの階層を作成して、アプリケーションがスローするすべての一般的な例外を処理できます。または、Beanとその例外ハンドラーが埋め込まれたトップレベルの例外を作成することもできます。そして、トップレベルのものからいくつかの特定の例外を導き出します。

public abstract class MyApplicationException<T> extends Exception {
    private T faultBean;

    // Constructors, setters/getters
}

@Provider
public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException<?>> {
    // Implementation
}
于 2013-01-21T15:45:22.900 に答える
0

これを行う1つの方法は、次のようにjavax.ws.rs.core.Responseオブジェクトを使用することです。

@得る

@道("/")

パブリックレスポンスgetBlah()

{{

try {
    return Response.status(Response.Status.OK)
            .entity(<Object you want to return>).build();
}
catch (final DuplicateRuleNameFault e) {
    return Response.status(Response.Status.BAD_REQUEST)
            .entity(e.getFaultBean().getMsg()).build();
}

}

于 2013-01-21T15:39:45.260 に答える