有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在编写服务器端和客户端。如果请求成功或出现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上的此类错误案例吗


共 (4) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    为了将用户消息返回给客户机,首先需要创建一个包含该消息的简单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;
                }
    

    在你的客户端代码中,只需检查消息。getUserCode()!=用户信息。用户代码。成功,然后显示错误消息

  3. # 3 楼答案

    最好在服务器端创建一个错误处理pojo类,如下所示,并在catch块中使用json转换返回其对象,并显示正确的错误消息。在客户端,您可以成功访问其属性,或者访问ajax或rest调用的块

    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;
    
    }
    
  4. # 4 楼答案

    如果您有这样的DB错误,executeUpdate将抛出一个SQLException

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

    • 最简单的方法是使用try-catch块
    • 更高级的方法是使用拦截器(如果是j2ee)或AoP(如果是Spring)以更全面的方式处理异常