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

Java 如何从restful服务返回数据库错误?,java,sql,postgresql,rest,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. 如果数据库上有更新,我可以像这样检查它

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

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


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

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


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

最好在服务器端(如下面所示)处理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;

}

最好在服务器端创建一个错误处理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;

}

如果出现这样的DB错误,executeUpdate将抛出一个错误

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

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

如果出现这样的DB错误,executeUpdate将抛出一个错误

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

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

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

请注意,Jersey正在将UserMessage转换为XML(序列化)。这当然可以是JSON

客户端代码(同样假定)


在客户端代码中,只需检查msg.getUserCode()!=UserMessage.UserCodes.SUCCESS,然后显示错误消息。

要将用户消息返回到客户端,首先需要创建一个包含该消息的简单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)

请注意,Jersey正在将UserMessage转换为XML(序列化)。这当然可以是JSON

客户端代码(同样假定)


在客户端代码中,只需检查msg.getUserCode()!=UserMessage.UserCodes.SUCCESS,然后显示错误消息。

此操作。服务器应该屏蔽来自客户端的确切错误,除非它是由客户端的请求引起的(但是,如果没有验证,它不应该传播到DB/DAO层)。如果我的问题有错误,很抱歉。我需要将错误字符串返回到客户端,即
“image\u id已经存在”
您可以将消息作为正文添加到returnvalue中。我不知道您是否使用了任何框架,例如Jersey(我希望您使用),那么您可以添加:
return Response.status(Response.status.CONFLICT).entity(“image_id已经存在”).build()这个。服务器应该屏蔽来自客户端的确切错误,除非它是由客户端的请求引起的(但是,如果没有验证,它不应该传播到DB/DAO层)。如果我的问题有错误,很抱歉。我需要将错误字符串返回到客户端,即
“image\u id已经存在”
您可以将消息作为正文添加到returnvalue中。我不知道您是否使用了任何框架,例如Jersey(我希望您使用),那么您可以添加:
return Response.status(Response.status.CONFLICT).entity(“image_id已经存在”).build()作为程序员,您应该确保插入数据库中的键是唯一的。让用户发送/创建不正确的密钥是一种不好的做法,因此这似乎主要是一个设计问题。@dsp\u用户,因为它是服务器客户端项目。如果没有服务,客户端应该如何知道数据库?不,我认为服务器端代码应该创建唯一的密钥。您可以使用数据库中的序列或自动递增的字段/列(最简单的解决方案)。也就是说,有时您可能仍然希望将用户消息发送回客户端,为此您确实可以创建一个简单的Java类(POJO)并向客户端返回一个POJO对象。@dsp_user yes,所以问题是我将如何以最佳方式创建这个POJO类来处理此类错误。我将编写一个简单的示例并发布在这里。您,作为程序员,应该确保数据库中插入的密钥是唯一的。让用户发送/创建不正确的密钥是一种不好的做法,因此这似乎主要是一个设计问题。@dsp\u用户,因为它是服务器客户端项目。如果没有服务,客户端应该如何知道数据库?不,我认为服务器端代码应该创建唯一的密钥。可以在数据库中使用序列或自动递增字段/