Java 如何从restful服务返回数据库错误?
我正在编写服务器端和客户端。如果请求成功或出现HTTP 404、400、405等错误。。。我可以毫无问题地处理它。然而,我不知道从数据库方面处理错误的最佳方法是什么。喜欢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. 如果数据库上有更新,我可以像这样检查它
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)以更全面的方式处理异常
- 最简单的方法是处理try-catch块李>
- 更高级的方法是使用拦截器(如果是j2ee)或AoP(如果是Spring)以更全面的方式处理异常
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用户,因为它是服务器客户端项目。如果没有服务,客户端应该如何知道数据库?不,我认为服务器端代码应该创建唯一的密钥。可以在数据库中使用序列或自动递增字段/