gpt4 book ai didi

java - 如何处理 Spring Rest API 上的内部服务器错误(500)?

转载 作者:IT老高 更新时间:2023-10-28 13:50:11 27 4
gpt4 key购买 nike

早安,

我正在开发 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)时,此代码运行良好,但是当我从 Controller 方法抛出空指针异常时,此方法没有捕获它。

谢谢。

最佳答案

@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 标记的方法分开也是一个好习惯,它将解耦处理程序逻辑。

关于java - 如何处理 Spring Rest API 上的内部服务器错误(500)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48508285/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com