【问题标题】:How to handle Internal server error (500) on spring rest API?如何处理 Spring Rest API 上的内部服务器错误(500)?
【发布时间】:2018-07-08 13:31:01
【问题描述】:

早安,

我正在开发 spring rest api,我想确保一切正常。我想记录异常行为,例如 nullPointerException 或数据库连接错误或任何可能引发但未处理或未假定的异常。

我想捕捉任何未处理的异常并向用户显示漂亮的消息,而不是打印堆栈跟踪。

为此,我在互联网上找到了扩展 ResponseEntityExceptionHandler 并覆盖 handleExceptionInternal 方法的解决方案。

我还想记录 404 错误以查看是否有人试图攻击我的服务器。

我还在属性文件中添加了这一行:spring.mvc.throw-exception-if-no-handler-found=true

这里是handleExceptionInternal的代码

@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {

    GenericResponse response = new GenericResponse();
    response.setMessage("Internal error occured, " + ex.getStackTrace()[0]);

    System.out.println("big exceptions");

    return new ResponseEntity(response, headers, status);

}

我的问题是,当我传递不正确的路线(如 /abc)时,此代码运行良好,但是当我从控制器方法抛出空指针异常时,此方法没有捕获它。

谢谢。

【问题讨论】:

  • Spring 默认不处理NullPointerException。如果您检查ResponseEntityExceptionHandler,您将看到一个包含已处理异常的列表。您可以扩展实现 HandlerExceptionResolver 并实现自定义逻辑(不要忘记将您的方法与 @ExceptionHandler(NullPointerException.class) 映射。例如,Spring Data Rest 有一个自定义处理程序,运行通过。
  • 我不在乎它是否为空异常,我只是喜欢处理各种异常,例如异常类
  • 你可以看到 spring 实现,只需用 @ExceptionHandler(RuntimeException.class) 标记你的方法 - 这种方式非常通用,它会强制你 instanceof 你的异常。
  • 你能显示一些代码sn-p吗?如果可行,我会接受这个答案,我真的被困在这里了。
  • ControllerAdvice 是要走的路

标签: java spring rest spring-mvc


【解决方案1】:
@ControllerAdvice
public class Handler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handle(Exception ex, 
                HttpServletRequest request, HttpServletResponse response) {
        if (ex instanceof NullPointerException) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}

ExceptionHandler 文档 - 在这里您可以找到方法签名可以操作的所有对象。

ControllerAdvice - 没有其他属性,它将处理所有异常,因此它可以提供意外行为。最好为basePackages 属性提供一个包(你的包),它只会处理指定包中抛出的异常。

另外,将异常与自定义 @ExceptionHandler 标记的方法分开是一种很好的做法,它将解耦处理程序逻辑。

【讨论】:

  • 因为请求处理的Filter Stage不涉及Spring异常处理。我在实践中看到的唯一可能的方法(有点松脆) - 是使用ExceptionHandlingFilter
猜你喜欢
  • 2020-02-07
  • 2020-02-19
  • 2016-01-10
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2022-11-26
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多