gpt4 book ai didi

java - Spring Boot 默认异常映射到标准 HTTP 状态代码

转载 作者:行者123 更新时间:2023-12-05 00:46:02 25 4
gpt4 key购买 nike

我知道可以在 Spring Boot 中定义自定义异常处理程序并具有例如IllegalArgumentException异常映射到 HTTP 400 错误请求。我想知道 Spring Web/Boot 中定义的任何现有异常是否映射到标准 HTTP 状态代码?这样我就可以抛出它们,它们将自动映射到标准 HTTP 状态代码。

最佳答案

默认情况下,ResponseEntityExceptionHandler 将有效地将 Spring 内部抛出的异常转换为 HTTP 状态代码。但是,将异常转换为 HTTP 状态代码不会提供有关异常的任何重要日志。良好的安全实践规定,外部发送的错误消息应尽可能少地提供有关系统内部的信息。相反,日志应尽可能提供信息。

此外,ResponseEntityExceptionHandler 只处理 Spring 生成的异常。所有与业务相关的异常都必须单独处理。例如,此类不会处理从 findSomething(xxx) 方法抛出的“Record not found”异常。

以下是有关如何解决这些缺点的示例:

Spring 抛出内部错误
您必须覆盖感兴趣的异常的处理程序,并提供要返回给调用者的内部日志消息和外部错误消息。

@ControllerAdvice 是一个注释,它用声明 @ExceptionHandler 注释方法的类包装 @Component 类。简单地说,这些处理程序将包装所有 @Component 方法。

@Slf4j
@ControllerAdvice
public class InternalExceptionHandler extends ResponseEntityExceptionHandler {

@Override
public ResponseEntity<Object> handleMissingServletRequestParameter(
MissingServletRequestParameterException e,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {

LogError error = new LogError("MissingServletRequestParameterException",
HttpStatus.BAD_REQUEST,
String.format("Missing '%s' parameter", e.getParameterName()));
log.debug(error.toJson());

HttpErrorResponse response = new HttpErrorResponse(error.getStatus(), e.getMessage());
return new ResponseEntity<>(response.toJson(),
HeaderFactory.getErrorHeaders(),
response.getStatus());
}

....
}

业务层抛出错误

您必须首先为这些异常中的每一个创建一个特定的 RuntimeException 类,并使用 @ResponseStatus 对其进行注释。
@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);
}
}

然后,您创建一个带有 @ControllerAdvice 注释的类,该类将保存所有这些异常处理程序方法。没有类可以派生,因为这些 @ExceptionHandler 注释方法的内部重定向由 Spring 管理。
@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());
}
....
}

最后,帮助类 LogError 和 HttpErrorResponse 是它们各自目标的简单格式化程序。

希望这可以帮助。

jack

关于java - Spring Boot 默认异常映射到标准 HTTP 状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50251951/

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