【发布时间】: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