优化
This commit is contained in:
@@ -21,6 +21,7 @@ import org.springframework.web.bind.MissingServletRequestParameterException;
|
||||
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
@@ -79,6 +80,15 @@ public class GlobalExceptionHandler {
|
||||
return failure(ResultCode.FORBIDDEN, ResultCode.FORBIDDEN.message(), request);
|
||||
}
|
||||
|
||||
@ExceptionHandler(ResponseStatusException.class)
|
||||
public ResponseEntity<ApiResponse<Void>> handleResponseStatus(
|
||||
ResponseStatusException exception, HttpServletRequest request) {
|
||||
ResultCode code = resultCode(exception.getStatusCode().value());
|
||||
String message = exception.getReason() == null || exception.getReason().isBlank()
|
||||
? code.message() : exception.getReason();
|
||||
return failure(code, message, request);
|
||||
}
|
||||
|
||||
@ExceptionHandler(Exception.class)
|
||||
public ResponseEntity<ApiResponse<Void>> handleUnexpected(Exception exception, HttpServletRequest request) {
|
||||
log.error("Unhandled request failure requestId={} traceId={}",
|
||||
@@ -123,4 +133,18 @@ public class GlobalExceptionHandler {
|
||||
meterRegistry.counter("baiyue.api.business.failures", "code", code.code()).increment();
|
||||
}
|
||||
}
|
||||
|
||||
private ResultCode resultCode(int status) {
|
||||
return switch (status) {
|
||||
case 400 -> ResultCode.BAD_REQUEST;
|
||||
case 401 -> ResultCode.UNAUTHORIZED;
|
||||
case 403 -> ResultCode.FORBIDDEN;
|
||||
case 404 -> ResultCode.NOT_FOUND;
|
||||
case 409 -> ResultCode.CONFLICT;
|
||||
case 422 -> ResultCode.VALIDATION_FAILED;
|
||||
case 429 -> ResultCode.TOO_MANY_REQUESTS;
|
||||
case 503 -> ResultCode.SERVICE_UNAVAILABLE;
|
||||
default -> ResultCode.INTERNAL_ERROR;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ import org.springframework.validation.FieldError;
|
||||
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||
import org.springframework.web.bind.MissingRequestHeaderException;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
@@ -87,6 +89,20 @@ class GlobalExceptionHandlerTest {
|
||||
.tag("code", ResultCode.CONFLICT.code()).counter().count()).isEqualTo(1.0);
|
||||
}
|
||||
|
||||
@Test
|
||||
void responseStatusConflictMapsToCanonicalConflictInsteadOfInternalError() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.setAttribute(CorrelationContext.REQUEST_ID, "stale-version");
|
||||
|
||||
var response = handler.handleResponseStatus(
|
||||
new ResponseStatusException(HttpStatus.CONFLICT, "Order was changed; refresh and retry"), request);
|
||||
|
||||
assertThat(response.getStatusCode().value()).isEqualTo(200);
|
||||
assertThat(response.getBody().code()).isEqualTo(ResultCode.CONFLICT.code());
|
||||
assertThat(response.getBody().message()).isEqualTo("Order was changed; refresh and retry");
|
||||
assertThat(response.getBody().requestId()).isEqualTo("stale-version");
|
||||
}
|
||||
|
||||
private void paging(long page) {
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user