信息在@ControllerAdvice类中传递到何处

时间:2017-10-25 14:52:49

标签: java spring spring-mvc error-handling

我一直在关注使用Spring框架进行错误处理的几个教程。我的handleNullPointer方法确实捕获了空指针异常。但是,我想知道该方法之后返回的位置,因为我想在前端(网页)上显示错误的一些信息。这是我的GlobalControllerExceptionHandler和handleNullPointer方法(以及其他包含错误处理的实现尝试):

@ControllerAdvice
public class GlobalControllerExceptionHandler extends ResponseEntityExceptionHandler {
    /* A different attempt at error handling
    @ExceptionHandler({Exception.class})
    public ResponseEntity<Object> handleAll (Exception exception, WebRequest request) {
        ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, exception.getLocalizedMessage(), "error occured");
        return new ResponseEntity<Object>(apiError, new HttpHeaders(), apiError.getStatus());
    }*/

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody ErrorInfo
    handleNullPointer(HttpServletRequest req, Exception exception){
        System.out.println("This worked.");
        return new ErrorInfo(req.getRequestURL().toString(), exception);
    }
}

我的想法是,我不得不在前端的javascript中获取此信息以显示信息,但我是javascrip的新手。所以,我仍然不确定这是否是我应该使用的解决方案。

供参考,这是我的ErrorInfo类:

public class ErrorInfo {
    public final String url;

    public final String exceptionMessage;

    public ErrorInfo(String url, Exception exception){
        this.url = url;
        this.exceptionMessage = exception.getLocalizedMessage();
    }

1 个答案:

答案 0 :(得分:1)

你在这里做的几乎就是Spring为你做的事情,你不必手动捕捉每一个例外。

E.g。如果您在任何控制器中执行throw new NullPointerException("Something went wrong");,Spring将返回500,其中包含包含错误消息的响应正文。

您没有提及 您发送请求的方式,但如果您使用fetch,则读取响应的方式如下:

fetch("/path/to/resource").then(function(response) {
    return response.json();
}).then(function(json) {
    alert(json.error_description);
});

会提醒Something went wrong;

我能想到你在问题中提出的方式实际上想要捕获异常的唯一原因是,如果你想在返回响应之前做其他事情,比如关于异常的日志信息。但在这种情况下,您可以捕获异常,执行日志记录,然后重新抛出,并信任Spring将此信息转换为正确的500响应。

相关问题