2014-10-07 58 views
0

我要介绍全球处理器我的web应用程序:@ExceptionHandler当地VS全球

@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它由当地一个不GLO处理bal。为了解决这个问题,我可以在这些控制器中添加类似于全局的本地处理程序。但是对我来说这不是一件好事。

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

回答

1

您需要在本地ExceptionHandler以及更多一般例外中加入更具体的例外情况全局ExceptionHandler。与Java异常处理类似。如果你把General一个放在本地,所有异常都会在那里结束,因为它是最接近的异常。

@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); 
} 
0

春exceptionHandler的工作原理有点像try和catch

当控制器有一个例外,它有一个本地异常处理程序的请求将由当地的异常处理程序进行处理。现在,如果它找不到本地,那么我们试图寻找全球。

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