我正在写服务器和客户端。如果请求成功或有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
上的错误案例。
答案 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。
有几种方法可以解决这个问题:
答案 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,然后显示错误消息。