This commit is contained in:
2026-08-06 18:01:59 +08:00
parent 584f1519d1
commit 6e9739826c
24 changed files with 549 additions and 62 deletions
@@ -94,12 +94,21 @@ public class GlobalExceptionHandler {
private ResponseEntity<ApiResponse<Map<String, String>>> validationResponse(
Map<String, String> errors, HttpServletRequest request) {
ResultCode code = ResultCode.VALIDATION_FAILED;
ApiResponse<Map<String, String>> body = ApiResponse.of(code, code.message(), errors,
ApiResponse<Map<String, String>> body = ApiResponse.of(code, validationMessage(errors), errors,
CorrelationContext.requestId(request), CorrelationContext.traceId(request));
recordFailure(code);
return ResponseEntity.ok(body);
}
private String validationMessage(Map<String, String> errors) {
if (errors.isEmpty()) {
return ResultCode.VALIDATION_FAILED.message();
}
return errors.entrySet().stream()
.map(entry -> entry.getKey() + ": " + entry.getValue())
.collect(java.util.stream.Collectors.joining(";"));
}
private ResponseEntity<ApiResponse<Void>> failure(ResultCode code, String message,
HttpServletRequest request) {
ApiResponse<Void> body = ApiResponse.failure(code, message,
@@ -7,6 +7,9 @@ import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.test.util.ReflectionTestUtils;
@@ -43,6 +46,21 @@ class GlobalExceptionHandlerTest {
assertThat(response.getBody().code()).isEqualTo(ResultCode.BAD_REQUEST.code());
}
@Test
void validationDetailsAreIncludedInMessageAndData() {
MockHttpServletRequest request = new MockHttpServletRequest();
BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(new Object(), "request");
bindingResult.addError(new FieldError("request", "carrierId", "不能为null"));
bindingResult.addError(new FieldError("request", "carrierName", "不能为空"));
var response = handler.handleBinding(new BindException(bindingResult), request);
assertThat(response.getBody().code()).isEqualTo(ResultCode.VALIDATION_FAILED.code());
assertThat(response.getBody().message()).isEqualTo("carrierId: 不能为null;carrierName: 不能为空");
assertThat(response.getBody().data()).containsEntry("carrierId", "不能为null")
.containsEntry("carrierName", "不能为空");
}
@Test
void recordsBusinessFailureMetricByFiniteResultCode() {
SimpleMeterRegistry registry = new SimpleMeterRegistry();