我尝试创建一个全局异常处理程序来处理我所有的
ResourceNotFoundException
via
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.ErrorResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex,
WebRequest request) {
ErrorResponse errorResponse = ErrorResponse.create(ex, HttpStatus.NOT_FOUND, ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
}
错误已按预期处理。然而,在我的响应 JSON 中,我现在有了具体的实现细节,我认为与 API 用户共享它们是不好的做法:
"detailMessageCode":"problemDetail.net.javaguides.springboot.exception.ResourceNotFoundException","detailMessageArguments":null,"titleMessageCode":"problemDetail.title.net.javaguides.springboot.exception.ResourceNotFoundException"
我发现ErrorResponse工厂方法使用DefaultErrorResponseBuilder,它将
typeMessageCode
、detailMessageCode
设置为异常的类。
我喜欢标准化错误的想法(
RFC 9457
),对我来说,默认实现将非常好,如果不共享实现细节的话。有人可以向我解释一下在错误响应正文中包含 java 实现详细信息的好理由吗?如果没有,我想我必须自己实现一个自定义的ErrorResponse
而不设置这些代码。
实现自定义错误消息类,而不是检查特定类型的异常,而是检查通用级别的异常,并在方法中实现逻辑。
@ControllerAdvice
public class ExceptionMapper extends ResponseEntityExceptionHandler {
@ExceptionHandler(Throwable.class)
@ResponseBody
public ResponseEntity<Error> handleException(HttpServletRequest req, Exception exception) {
String message = "Internal Server Error";
String code = "";
if ( exception instanceof ResourceNotFoundException) {
ResourceNotFoundException exc = (ResourceNotFoundException) exception;
status = HttpStatus.NOTFOUND;
message = exc.getMessage();
}
Error error = new Error();
error.setCode(code);
error.setTraceId(tracID);
error.setMessage(message);
error.setReason(message);
// set more fields in case needed
return new ResponseEntity<Error>(error, status);
}
}
Public class Error{
//setter getter
}
ResponseEntityExceptionHandler Spring提供的类,用于处理异常并映射到适当的错误响应。