SpringMVC:显示失败的AJAX请求的错误视图

时间:2017-02-03 10:50:42

标签: javascript jquery ajax spring error-handling

我有一个网页,在用户查询时,向服务发出请求,并使用从 AJAX 收到的数据自行呈现HTML表格(而不是整个页面)。

有两种方法可以调用该服务:

  1. 通过API :my.website.com/api/person/John - >这将返回原始JSON
  2. AJAX请求:my.website.com/person#John - >在内部调用API,并使用it gest
  3. 填充HTML表

    正在发生的事情是,如果发生internal error

    1. 通过API 调用时:显示自定义错误视图 - 这是所需的行为
    2. 当使用 AJAX请求进行调用时:自定义错误视图不会显示 - 而是所有发生的事情都是HTML表格没有被填充 - 不良行为。我也想要错误视图!
    3. 的javascript

      function displayPersonData(template, person) {
              var url = "/api/person/" + person;
      
              $.getJSON(url, function (data) {
                  renderHtmlTable(template, data);
              });
      }
      

      APIcontroller.java

      @RequestMapping(value = "api/person/{person}", produces = "application/json", method = RequestMethod.GET)
      public @ResponseBody Person execute(@PathVariable(value = "person") String person) {
      
              Random r = new Random();
              if(r.nextDouble() > 0.5) {
                  return proxy.getPersonData(person); // returns JSON
              } else {
                  throw new MyCustomException("Test");
              }       
      }
      

      错误Controller.java

      @ExceptionHandler(MyCustomException.class)
      @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
      public ModelAndView errorCallingService() {
          LOG.error(MessageFormat.format("Call to %s failed.", PERSON_SERVICE)); // the logs gets triggered successfuly
      
          return new ModelAndView("error_view.jsp"); // error_view doesnt get displayed
      }
      

      错误控制器成功触发抛出的异常,并生成日志。但由于某种原因,它不会显示error_view.jsp。仅在使用AJAX调用时。

      有解决方案吗?而且我不想重定向到错误页面,它似乎没有像以下网址那样:my.website.com/exception_view

1 个答案:

答案 0 :(得分:0)

首先,您应该知道ajax请求会以文本形式提供响应,而不是重定向。所以你应该自己处理视图渲染。 但是目前你很可能甚至没有从服务器获得文本,因为:

  • 如果您的错误视图名称为“error_view.jsp”,则spring将尝试在“/api/person/error_view.jsp”中查找视图。在这种情况下,将返回值更改为“/error_view.jsp”以防止创建相对路径。
  • 另一点是$ .getJSON可能会在客户端产生错误,因为如果出现错误,响应内容类型为text / html。请改用$ .ajax。
  • 最后,HttpStatus.INTERNAL_SERVER_ERROR会导致您的请求失败,因此您需要注册另一个回调错误。

要处理返回的html,您可以将其放在页面上的预定义占位符中。所以代码在js中看起来像这样:

function displayPersonData(template, person) {
    var url = "/api/person/" + person;

    $.ajax({
      url: url,
      success: function (data) {
        renderHtmlTable(template, data);
      },
      error: function (xhr) {
        $("#placeholder").html(xhr.responseText);
      },
    );
}