我将在我的网络应用程序中介绍全局处理程序:
@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的本地处理程序。但就我而言,这不是一个好的。
问题:是否可以将处理自定义异常重定向到全局处理程序?
答案 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处理所有异常,因此不会调用全局异常处理程序。