我有一个网页,在用户查询时,向服务发出请求,并使用从 AJAX 收到的数据自行呈现HTML表格(而不是整个页面)。
有两种方法可以调用该服务:
正在发生的事情是,如果发生internal error
:
的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
答案 0 :(得分:0)
首先,您应该知道ajax请求会以文本形式提供响应,而不是重定向。所以你应该自己处理视图渲染。 但是目前你很可能甚至没有从服务器获得文本,因为:
要处理返回的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);
},
);
}