我知道可以在Spring Boot中定义自定义异常处理程序,例如映射到HTTP 400错误请求的IllegalArgumentException
异常。我想知道Spring Web / Boot中定义的任何现有异常是否映射到标准HTTP状态代码?这样我就可以抛出它们,它们将自动映射到标准的HTTP状态代码。
答案 0 :(得分:3)
实际上,ResponseEntityExceptionHandler默认情况下会将Spring内部抛出的异常转换为HTTP状态代码。但是,将异常转换为HTTP状态代码不会提供有关异常的任何重要日志。良好的安全实践要求外部调度的错误消息对系统内部的信息最少。相反,日志应尽可能提供信息。
此外,ResponseEntityExceptionHandler只处理Spring生成的异常。所有与业务相关的例外必须单独处理。例如,"未找到记录"此类不处理从findSomething(xxx)方法抛出的异常。
以下是如何解决这些缺点的示例:
Spring throwned内部错误 您必须覆盖感兴趣的异常的处理程序,并提供内部日志消息和要返回给调用方的外部错误消息。
@ControllerAdvice是一个注释,它使用声明@ExceptionHandler注释方法的类包装@Component类。简而言之,这些处理程序将包装所有@Component方法。
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Record not found") //
public class RecordNotFoundException extends RuntimeException {
private static final long serialVersionUID = 8857378116992711720L;
public RecordNotFoundException() {
super();
}
public RecordNotFoundException(String message) {
super(message);
}
}
业务层抛出错误
您必须首先为每个异常创建一个特定的RuntimeException类,并注释它@ResponseStatus。
@Slf4j
@ControllerAdvice
public class ClientExceptionHandler {
@ExceptionHandler(value = RecordNotFoundException.class)
public ResponseEntity<String> handleRecordNotFoundException(
RecordNotFoundException e,
WebRequest request) {
LogError logging = new LogError("RecordNotFoundException",
HttpStatus.NOT_FOUND,
request.getDescription(true));
log.info(logging.toJson());
HttpErrorResponse response = new HttpErrorResponse(logging.getStatus(), e.getMessage());
return new ResponseEntity<>(response.toJson(),
HeaderFactory.getErrorHeaders(),
response.getStatus());
}
....
}
然后,您创建一个@ControllerAdvice注释类,它将包含所有这些异常处理程序方法。没有类派生,因为这些@ExceptionHandler注释方法的内部重定向由Spring管理。
{{1}}
最后,帮助程序类LogError和HttpErrorResponse是各自目标的简单格式化程序。
希望这有帮助。
杰克
答案 1 :(得分:2)
有一些例如映射到405的HttpRequestMethodNotSupportedException
。
查看ResponseEntityExceptionHandler.handleException()
方法,该方法定义了处理Spring MVC中常见异常的基本规则。你会发现
NoSuchRequestHandlingMethodException.class,
HttpRequestMethodNotSupportedException.class,
HttpMediaTypeNotSupportedException.class,
HttpMediaTypeNotAcceptableException.class,
MissingPathVariableException.class,
MissingServletRequestParameterException.class,
ServletRequestBindingException.class,
ConversionNotSupportedException.class,
TypeMismatchException.class,
HttpMessageNotReadableException.class,
HttpMessageNotWritableException.class,
MethodArgumentNotValidException.class,
MissingServletRequestPartException.class,
BindException.class,
NoHandlerFoundException.class,
AsyncRequestTimeoutException.class