如何处理spring rest API上的内部服务器错误(500)?

时间:2018-01-29 19:05:16

标签: java spring rest spring-mvc

美好的一天,

我正在开发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这个代码运行正常,但是当我从控制器方法抛出空指针异常时,这个方法没有捕获它。

感谢。

1 个答案:

答案 0 :(得分:7)

require(rvest)
require(dplyr)

url <- read_html('https://www.zalando.nl/damesschoenen-sneakers/')
selector_name <- '.z-nvg-cognac_brandName-2XZRz'
output <- html_nodes(x = url, css = selector_name) %>% html_text

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

@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标记方法也是一种很好的做法,它会解耦处理程序逻辑。