在Spring Boot应用程序中,我将如何捕获内部抛出的异常,这些异常本来会逃逸到客户端,但不会捕获Spring MVC异常?

时间:2018-12-20 10:28:52

标签: java spring spring-mvc spring-boot

我的Spring Boot应用程序中有一个类,该类使用@ControllerAdvice自动处理许多特定的异常:

@ControllerAdvice
@RequestMapping(produces = APPLICATION_JSON_UTF8_VALUE)
public class RestResponseEntityExceptionHandler {

例如,我抓住了这一点:

@ExceptionHandler(OptimisticLockingFailureException.class)
public ResponseEntity<ErrorDTO> optimisticLockingFailureException(final OptimisticLockingFailureException e) {
    LOGGER.info("Encountered OptimisticLockingFailureException", e);
    ErrorDTO errorDTO = new ErrorDTO("CONFLICT_ERROR", "Object was locked by ano user, please refresh and try again.");
    return new ResponseEntity<>(errorDTO, HttpStatus.CONFLICT);
}

甚至是底层数据库异常:

@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<ErrorDTO> dataIntegrityViolationException(final DataIntegrityViolationException e) {

但是有时仍然有一些异常逃逸到我没有专门处理并且不知道的客户端上。在日益复杂的应用程序中,我无法预测所有异常的名称。

所以我天真地添加了这个:

@ExceptionHandler(Exception.class)
protected ResponseEntity<ErrorDTO> exception(final Exception e) {
    ErrorDTO error = new ErrorDTO(
            "Test", "test");
    return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}

但这可以捕获所有内容,甚至包括Spring MVC异常。因此,现在,如果我向某个不存在的端点发出请求,并且通常Spring MVC可以很好地处理此请求,那么它现在也陷入了我的方法中,我不希望这样做。

我将如何做到这一点,以便将控制器入口点之后发出的所有异常都捕获在这里,以使客户端永远不会看到堆栈跟踪,而Spring MVC在甚至输入代码之前处理的所有内容都可以正常处理?

1 个答案:

答案 0 :(得分:0)

如果需要常见错误消息,可以尝试在ControllerAdvice上扩展ResponseEntityExceptionHandler并覆盖handleExceptionInternal。我相信您必须将某些内容添加到应用程序属性中。