2013-03-02 5 views
5

私は次のようにエンドポイントが生成されます:返すエラーが

public Book insertBook(Book book) { 
    PersistenceManager mgr = getPersistenceManager(); 
    try { 
     if (containsShout(book)) { 
      throw new EntityExistsException("Object already exists"); 
     } 
     mgr.makePersistent(book); 
    } finally { 
     mgr.close(); 
    } 
    return book; 
} 

私はクライアントにエラーを返す必要がありますか疑問に思います。 など。この本にはいくつかの必須フィールド、ISNMチェックなどが含まれています。

私は例外をスローすると思いますが、返されたjsonレスポンスにはどのようにマップされますか。 jsonのrepsonseには、クライアントのこれらのフィールドを強調表示するために、すべてのフィールドエラーが含まれている必要があります。

+0

あなたは、この問題を解決するために管理していましたか?あなたはどうやってそれをやったのですか? – dynamokaj

+0

いいえ、私はもう興味がありません –

答えて

5

通常、例外は応答内の500 httpステータスコードにマップされます。あなたは、Androidであなたのエンドポイントを消費した場合、エラーコードがIOExceptionをにスローされます> 404

- > 400 com.google.api.server.spi.response.UnauthorizedException - - > 401 com.google.api.server.spi.response.ForbiddenException - > 403 com.google.api.server.spi.response.NotFoundException com.google.api.server.spi.response.BadRequestException:以下の例外を使用すると、異なるコードを取得することができますあなたはそれに応じて対応することができます。

+0

はい私はHTTPエラーコードを返すことを理解します。私が不思議なのは、ドメインプロパティの違反したような詳細なエラーメッセージに対処する方法です。 –

+0

これは私が1.7.5で見ている動作ではありません。私はBadRequestExceptionを投げているし、クライアントはJSONのビットとして本体にメッセージ文字列200を取得しています。 – Eliot

+0

私はそれを修飾します:これはlocahost devサーバでは動作しませんが、1.7.5でもApp Engineサーバ上で動作するように見えます。だから、それは本当にlocalhost devサーバのバグです。 – Eliot

0

これを行うには、抽象クラスのEntityを使用します。

レスポンスコードがあり、これは列挙型であり、String ErrorMessageです。

"Book"はEntityから継承できます。あなたの応答は次のようになります。

public Book insertBook(Book book) { 
    PersistenceManager mgr = getPersistenceManager(); 
    try { 
     if (containsShout(book)) { 
      book.setResponseCode(ResponseCode.ERROR); 
      book.setError("Object already exists"); 
     } else { 
      mgr.makePersistent(book); 
     } 
    } finally { 
     mgr.close(); 
    } 
    return book; 
} 
+0

答え@davibqに感謝しますが、これはエンティティクラスimoを汚染しません。たぶん私は、モデル、応答の状態とエラーを含むSingleEntitiyResponseを作成する必要があります。私はそれを拡張し、同様のrepsonse状況やエラーを含むことによってcom.google.api.server.spi.response.CollectionResponseについて同じことを行うことができますことに注意してください。 –

3

私はこのようなことを試み、私のためにうまくいったようです。

class Response<T> { 
    Status status; 
    String userFriendlyMessage; 
    T object; //your bean or entity object 

    RestResponse toRestResponse() { 
     RestResponse r = new RestResponse(); 
     r.status = status; 
     r.userFriendlyMessage = userFriendlyMessage; 
     r.object = object; 
    } 
} 

エンドポイントから汎用オブジェクトを戻すことはできません。レスポンスから作成できる同等のRestResponseクラスを作成します。

class RestResponse { 
    Status status; 
    String userFriendlyMessage; 
    Object object; 
} 

ステータスは次のようなものです。

public enum Status { 
    SUCCESS, RESOURCE_NOT_FOUND, RESOURCE_ALREADY_EXISTS; //etc 
} 

あなたのすべてのエンドポイント・メソッドが順番にレスポンスから構成されますRestResponseを返します(Tは、あなたのBeanやエンティティオブジェクトにすることができます)。

jsonレスポンス(RestResponse)をデシリアライズすると、レスポンスとして直ちにデシリアライズできます。

これが役に立ちます。

よろしく、 サティア

+0

これは私にとってはうまくいかず、「エラー:オブジェクトタイプTがサポートされていません。例:公共Response.RestResponse getBeer(){ 応答genericResponse =新しい応答()。 \t genericResponse.status = Status.SUCCESS。 genericResponse.object = new Beer( "Carlsberg"); return genericResponse.toRestResponse(); } – dynamokaj

+0

@dynamokaj - あなたには、いくつかのコードスニペットを投稿してくださいできますか? githubやその他のドキュメントにリンクすることができます。 – Sathya

+0

はいここにある:https://gist.github.com/dynamokaj/cb0c0569311d9d15ee40それはあなたのようにする必要があります。しかし私はフィールドを非公開にして、それを3つのファイルの代わりに1つのファイル(ResponseDto.java)に入れました。 – dynamokaj

関連する問題