从Spring MVC向jQuery报告错误的最佳实践

时间:2013-05-31 07:48:56

标签: jquery ajax spring-mvc error-handling

我的问题正如标题中提到的那样。我有Spring webservices返回JSON响应。以下哪项是处理错误的优雅方式:

  1. 从Spring MVC控制器中抛出一个异常,然后由jQuery的错误函数处理。
  2. 发送例如JSON响应设置。 result =“failure”然后在jquery的success函数中,检查'result'的值

    我想了解这两种方法的利弊。

  3. 由于

2 个答案:

答案 0 :(得分:7)

通过success或其他类似标志报告请求处理中的错误是开发Web服务的标准做法。也就是说,如果您的请求成功,则JSON响应中的该标记表示success,否则表示failure。您的JSON响应中可能有其他properties可以携带适当的消息,而另一个字段可以在请求成功时携带结果数据。

以这种方式开发服务时,Web服务的使用者不再依赖于自定义异常处理。使用您的第一种方法,他们必须自己解释HTTP代码并根据该代码确定行动方案。这总是会在客户端产生大量错误处理代码(可能在使用服务的每个地方都会重复)。相反,使用简单的错误标志,他们只需检查标志并确定请求是否成功,并显示适当的消息或采取其他一些操作。

我参与了一些Web服务(开发和消费)的处理,我从不处理依赖于Ajax的error处理程序的Web服务-call。

您的第一种方法的优点是您现在可以真正地将成功请求与不成功的请求分开。但是,在这种情况下,请确保您自己在服务器端处理这些异常,并根据这些异常返回适当的状态代码。如果不这样做,大多数异常将导致HTTP错误代码500,并且您的Web服务客户端可能很难以某种通用方式解释它。

有关在API中处理错误的正确方法的小讨论see here

答案 1 :(得分:0)

function addCustomer(){
      $.post( "customer/addCustomer", addCustomerForm.serialize() )
     .done(function(data) {
         if(data==='OK'){
             alert( "Customer saved");
         }else{
             alert(data);
         }
      }).fail( function(xhr, textStatus, errorThrown) {
         alert(textStatus + ":" + errorThrown);
      });
 }

 @RequestMapping(value = "addCustomer", method = RequestMethod.POST)
public  @ResponseBody String addCustomer(

        @RequestParam(required = true, value="add-customer-name") String customerName,
        @RequestParam(required = true, value="add-customer-city-name") String customerCity,
        @RequestParam(required = true, value="add-customer-distributer") String distributerNodeName,
        @RequestParam(required = true, value="add-customer-accountid") String accountId

    ){

    try{

        customersDao.createCustomer(customerName,customerCity, distributerNodeName, accountId);

    }catch(SQLException e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }catch(AlreadyExistsException e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }catch(QuoteLimitException e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }catch(Exception e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }

    return "OK";
}