代码之家  ›  专栏  ›  技术社区  ›  Sebastiaan van den Broek

在Spring引导应用程序中,我如何捕获内部抛出的异常,否则这些异常会转移到客户端,而不是Spring MVC异常?

  •  0
  • Sebastiaan van den Broek  · 技术社区  · 7 年前

    我的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通常能很好地处理这个问题,那么它现在也会被我的方法捕获,我不希望这样。

    我该如何使我的控制器中的入口点之后发出的所有异常都在这里被捕获,这样客户机就不会看到stacktrace,但Spring MVC在我的代码输入之前处理的所有事情都会正常处理?

    1 回复  |  直到 7 年前
        1
  •  0
  •   xxDnGxX    7 年前

    如果需要常见的错误消息,可以尝试在ControllerAdvice上扩展ResponseEntityExceptionHandler,并重写handleExceptionInternal。我相信有些东西需要添加到应用程序属性中。