【问题标题】:SpringMVC: display error view on failed AJAX requestSpringMVC:在失败的 AJAX 请求上显示错误视图
【发布时间】:2017-06-20 17:19:33
【问题描述】:

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

调用服务有两种方式:

  1. 通过 API:my.website.com/api/person/John --> 这将返回原始 JSON
  2. AJAX 请求:my.website.com/person#John --> 在内部调用 API,并用它获取的数据填充 HTML 表

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

  1. 通过 API 调用时:显示我的自定义错误视图 - 这是所需的行为
  2. 当使用 AJAX 请求 调用时:不显示自定义错误视图 - 相反,所发生的只是 HTML 表没有被填充 - 不良行为。我也想要这里的错误视图!

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");
        }       
}

错误控制器.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 调用时。

有解决办法吗?而且我不想重定向到错误页面,只是有这样的 URL 似乎不正确:my.website.com/exception_view

【问题讨论】:

    标签: javascript jquery ajax spring error-handling


    【解决方案1】:

    首先,您应该知道 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);
          },
        );
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 2018-11-30
      相关资源
      最近更新 更多