如何从restful服务返回数据库错误?

时间:2016-08-31 06:44:51

标签: java sql postgresql rest

我正在写服务器和客户端。如果请求成功或有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.

如果db上有更新,我可以检查一下;

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上的错误案例。

4 个答案:

答案 0 :(得分:2)

客户端知道服务器有一些后端问题。因此,无论是导致问题的数据库,都应该只显示在rest-api的日志中。 您还可以在更新成功时返回HTTP 200(OK),在创建新记录时返回HTTP 201,在获得重复键冲突时返回HTTP 409(冲突)或类似。

处理您的数据库问题,只是编码,所以我想这不是您的问题; - )

答案 1 :(得分:0)

如下所示在服务器端执行一个错误处理pojo类并使用正确的错误消息在catch块中使用json转换返回其对象会很好,在客户端,您可以成功访问其属性,或者然后阻止您的ajax或休息电话

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;

}

答案 2 :(得分:0)

如果您遇到类似DB的错误,则executeUpdate会抛出SQLException

有几种方法可以解决这个问题:

  • 最简单的方法是使用try catch块处理。
  • 更高级的人会使用Interceptor(如果j2ee)或AoP(如果是Spring)以更多的方式处理异常

答案 3 :(得分:0)

为了将用户消息返回给客户端,首先需要创建一个包含消息的简单Java类(POJO)。

您的POJO可能看起来像

 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;
 }
 }

您的服务器端代码(在我的情况下为Jersey)

  @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;
 }

请注意,Jersey正在将UserMessage转换为XML(序列化)。这当然可以是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,然后显示错误消息。