2016-08-31 1 views
0

私はサーバー側とクライアント側の両方を書いています。リクエストが成功した場合やHTTP 404,400,405などのエラーが発生した場合は、問題なく処理できます。しかし、私はデータベース側からのエラーを処理する最良の方法は何か分かりません。好き。安心してサービスからデータベースエラーを返すには?

ERROR: duplicate key value violates unique constraint "UserInfo_image_id_key" 
SQL state: 23505 
Detail: Key (image_id)=(123123) already exists. 

データベースの更新がある場合は、次のようにチェックすることができます。

int result = ps.executeUpdate();       
      if (result > 0) { 
       System.out.println("Successfully updated"); 
       return true;       
      } else { 
       System.out.println("DB not updated!"); 
       return false; 
      } 

あなたは、私がelse loop上、このようなエラーケースを扱うことができるか私を助けてもらえます。

+0

プログラマは、データベースに挿入されたキーが一意であることを確認する必要があります。ユーザーが誤ったキーを送信/作成できるようにすることは悪い習慣であるため、主に設計上の問題と思われます。 –

+0

@dsp_userはサーバークライアントプロジェクトです。サービスがない場合、クライアント側はデータベースについてどのように知るべきですか? – goGud

+0

いいえ、私は、サーバー側のコードは一意のキーを作成する必要があると主張します。データベース内のシーケンスまたは自動インクリメントされたフィールド/列(最も簡単なソリューション)を使用できます。つまり、依然としてユーザーメッセージをクライアントに送り返したい場合があります。このために、単純なJavaクラス(POJO)を作成し、POJOオブジェクトをクライアントに返すことがあります。 –

答えて

0

で例外を処理するためのInterceptor(J2EEの場合)またはAOP(春場合)を使用する場合と、あなたはまず、必要性メッセージを含む単純なJavaクラス(POJO)を作成します。

あなたのPOJOは、(私の場合にはジャージー)ジャージはXML(シリアライズ)にUserMessageを変換していることを

@GET 
    @Path("/insertRecord") 
    @Produces(MediaType.APPLICATION_XML)) 
    public UserMessage someInsertMethod(@QueryParam("id") int id){ 
    UserMessage uMsg = new UserMessage(); 
    try{ 
//try insert here 

}catch(SqlException sqle){ 

    switch (sqle.getErrorCode()){ 
    case num1: //replace num1 with the actual error code 
    uMsg.setUserCode(UserMessage.UserCodes.DATA_ALREADY_EXIST); 
    uMsg.setUserMsg(" Key already exists"); 
    break; 
    case num2: 
    uMsg.setUserCode(UserMessage.UserCodes.DATA_WRONG_FORMAT); 
    uMsg.setUserMsg(" Data wrong format"); 
    break; 
    } 
    } 
return uMsg; 
} 

注意を

import java.io.Serializable; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "userMsg") 
public class UserMessage implements Serializable { 

    public enum UserCodes { SUCCESS, DATA_ALREADY_EXIST, DATA_WRONG_FORMAT }; 

private enum userCode ; 
private String userMsg ; 

public UserMessage(){ 
userCode = UserCodes.SUCCESS; //DEFAULT 
userMsg = "Request successful"; 
} 

public UserCodes getUserCode(){ 
return userCode; 
} 
public void setUserCode(UserCodes code){ 
userCode = code; 
} 
public String getUserMsg(){ 
return userMsg; 
} 
public void setUserMsg(String msg){ 
userMsg = msg; 
} 
} 

あなたのサーバー側のコードのように見えるかもしれません。もちろんこれはJSONでもかまいません。クライアントコードで

クライアントコード(再びジャージーを想定)

  ClientConfig config = new ClientConfig(); 

      Client client = ClientBuilder.newClient(); 

      WebTarget target = client.target(UriBuilder.fromUri("http://localhost:8088/JerseyRest").build()); 

      try{ 
       UserMessage msg =(UserMessage) target.path("rest").path("insertRecord").request() 
       .accept(MediaType.APPLICATION_XML).get(UserMessage.class); 

       if(msg.getUserCode() != UserMessage.UserCodes.SUCCESS) 
        System.out.println("Msg: " + msg.getUserMsg()); 


      }catch(Exception e){ 
       System.out.println(e); 
       return; 
      } 

だけmsg.getUserCode()!= UserMessage.UserCodes.SUCCESSいることを確認した後、エラーメッセージを表示します。

2

は、バックエンドに問題があることがわかっています。したがって、問題の原因となっているデータベースであっても、残りのAPIのログにのみ表示する必要があります。 更新が成功するとHTTP 200(OK)、新しいレコードが作成されたときはHTTP 201、重複するキー違反やそのようなときはHTTP 409(競合)を返すこともできます。

お使いのデータベースの問題への対処、単にコーディングされたので、私はそれは以下のようにサーバ側で1つのエラー処理POJOクラスを作ることが良いでしょう、あなたの質問;-)

+0

これです。クライアントの要求によって引き起こされた場合を除いて、サーバーはクライアントからの正確なエラーをブラックボックスに入れる必要があります(ただし、検証なしでDB/DAOレイヤーまで伝播しないでください)。 – Vasan

+0

申し訳ありませんが私の質問に間違っている場合。クライアント側に返すエラー文字列が必要です '' image_idは既に存在します "' ' – goGud

+0

あなたの返値に本文を追加することができます。フレームワークを使用しているかどうかわかりません。 Jersey(私がしたいと思う)、次に追加することができます: 'return Response.status(Response.Status.CONFLICT).entity(" image_id already exists ")。build();' –

0

ないとJSONでそのオブジェクトを返します推測しますクライアント側で適切なエラーメッセージとcatchブロックでの変換、あなたは成功でその属性にアクセスしたり、あなたのAJAXのブロックまたはあなたがのexecuteUpdateがスローされることのようなDBのエラーを持っていれば

public class CustomError { 

    public CustomError (int errorCode, String errorMessage) { 

     this.errorCode = errorCode; 
     this.errorMessage = errorMessage; 

    } 

    public CustomError (String errorMessage) { 

     this.errorMessage = errorMessage; 

    } 
    public CustomError() { 


    } 

    private String errorMessage; 

    private int errorCode; 

    public String getErrorMessage() { 
     return errorMessage; 
    } 

    public void setErrorMessage(String errorMessage) { 
     this.errorMessage = errorMessage; 
    } 

    public int getErrorCode() { 
     return errorCode; 
    } 

    public void setErrorCode(int errorCode) { 
     this.errorCode = errorCode; 
    } 


} 

try{ 

//db code 
}Catch(Exception e){ 

CustomError customError = new CustomError (errorCode,e.getMessage()); 
//covert customError to json 
return jsonString; 

} 
0

を呼び出して休むことができますSQLException

それを処理する方法はいくつかあります:

  • 最も単純つのtry catchブロックで処理することですが。
  • より高度1は、クライアントにユーザメッセージを返すために、よりボードの方法
関連する問題