@ExceptionHandler local vs global

时间:2014-10-07 07:59:14

标签: java spring spring-mvc exception-handling

我将在我的网络应用程序中介绍全局处理程序

@ControllerAdvice
public class GlobalControllerExceptionHandler {

    @ExceptionHandler(CustomRuntimeException.class)
    public @ResponseBody ImmutableMap<?, String> handleNullResponseException(CustomRuntimeException e) {
        return ImmutableMap.of(e.getClass(), e.getMessage());
    }
}

但问题是遗留代码包含一些带有本地处理程序的控制器,如下所示:

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public @ResponseBody ExceptionDetails handleException(Exception e) {
    return handleException(e);
}

当控制器抛出 CustomRuntimeException 时,它会由本地非全局处理。为了解决这个问题,我可以为每个控制器添加类似于global的本地处理程序。但就我而言,这不是一个好的。

问题:是否可以将处理自定义异常重定向到全局处理程序?

2 个答案:

答案 0 :(得分:1)

您需要在本地ExceptionHandler中添加更具体的例外,并在全局ExceptionHandler中添加更常见的例外情况。与Java异常处理类似。如果将General 1放在Local中,则所有Exceptions都将结束,因为它是最接近的例外并接受任何异常。

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(IOException.class)
public @ResponseBody ExceptionDetails handleIOException(IOException e) {
    return handleException(e);
}

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(NullPointerException.class)
public @ResponseBody ExceptionDetails handleNPException(NullPointerException e) {
    return handleException(e);
}

答案 1 :(得分:0)

Spring exceptionHandler的工作方式类似于try和catch

当控制器有异常并且它有一个本地异常处理程序时,请求将由本地异常处理程序处理。现在,如果它找不到本地,那么我们试图寻找全局。

在您的情况下,本地exceptionHandler处理所有异常,因此不会调用全局异常处理程序。