我在Spring Rest应用程序中使用全局异常处理程序,我想隐藏jdbc异常,但它没有按预期工作。我关闭数据库以强制连接异常,我可以在日志中看到以下异常,并且我收到默认的 spring 错误响应,但没有我在异常处理程序中定义的
响应java.lang.IllegalStateException: Could not resolve parameter [1] in public org.springframework.http.ResponseEntity<java.lang.Object> ...
throws java.io.IOException: No suitable resolver
这是代码。
@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({JDBCConnectionException.class})
public ResponseEntity<Object> dbError(JDBCConnectionException exception,
HttpHeaders headers,
HttpStatus status,
WebRequest request) throws IOException
{
Map<String,Object> body = new HashMap<>();
body.put("errorId",Long.valueOf(201));
body.put("state",HttpStatus.SERVICE_UNAVAILABLE.value());
body.put("message", "internal failure");
body.put("time", new Date().toString());
return new ResponseEntity<>(body, headers, status);
}
希望你能帮助我。
我发现了失败...对于这种例外,弹簧无法解决这两个参数。
HttpHeaders headers,
HttpStatus status
很明显,提到的异常参数 [1]
java.lang.IllegalStateException: Could not resolve parameter [1] in public org.springframework.http.ResponseEntity<java.lang.Object> ...
throws java.io.IOException: No suitable resolver
我删除了这两个参数,异常处理程序处理异常。
此代码现在有效
@ExceptionHandler(JDBCConnectionException.class)
public ResponseEntity<Object> dbError(Exception ex,
WebRequest request)
{
Map<String,Object> body = new HashMap<>();
body.put("errorId",Long.valueOf(201));
body.put("state",HttpStatus.SERVICE_UNAVAILABLE.value());
body.put("message", "internal failure");
body.put("time", new Date().toString());
return new ResponseEntity<Object>(body, HttpStatus.INTERNAL_SERVER_ERROR);
}
由于注释暗示@ControllerAdvice
用作 REST 端点上的扩展,因此这些异常处理程序将处理REST API的异常,并且不会影响它在控制台中的记录方式。相反,它将确定如何向最终用户报告异常,并允许您编写简洁的错误消息,而不会泄露有关程序的信息。
如果您想完全捕获异常,而不仅仅是针对 REST API,请查看此博客。
但是,我不建议这样做,因为这将大大减少您作为开发人员可用的信息,最终用户无法看到此信息,因此 REST API 自定义异常应提供足够的抽象。
我希望这对你有所帮助。