如何处理弹簧休息API上的内部服务器错误(500)?

2022-09-01 12:04:16

日安

我正在研究弹簧休息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这样的错误路由时,这个代码运行良好,但是当我从控制器方法中抛出空指针异常时,此方法不会捕获它。

谢谢。


答案 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();
    }
}

异常处理程序文档 - 在这里您可以找到方法签名可以操作的所有对象。

ControllerAdvice- 没有其他属性,它将处理所有异常,因此它可能会提供意外行为。最好向属性提供一个包(您的包),它将仅处理指定包中引发的异常。basePackages

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


答案 2