|
16 | 16 |
|
17 | 17 | package org.springframework.samples.petclinic.rest.advice; |
18 | 18 |
|
| 19 | +import java.net.URI; |
| 20 | +import java.time.Instant; |
| 21 | +import java.util.List; |
| 22 | +import java.util.Objects; |
| 23 | + |
19 | 24 | import jakarta.servlet.http.HttpServletRequest; |
20 | 25 | import org.slf4j.Logger; |
21 | 26 | import org.slf4j.LoggerFactory; |
|
24 | 29 | import org.springframework.http.ProblemDetail; |
25 | 30 | import org.springframework.http.ResponseEntity; |
26 | 31 | import org.springframework.samples.petclinic.rest.controller.BindingErrorsResponse; |
| 32 | +import org.springframework.samples.petclinic.rest.dto.ValidationMessageDto; |
27 | 33 | import org.springframework.validation.BindingResult; |
28 | 34 | import org.springframework.web.bind.MethodArgumentNotValidException; |
29 | 35 | import org.springframework.web.bind.annotation.ControllerAdvice; |
30 | 36 | import org.springframework.web.bind.annotation.ExceptionHandler; |
31 | 37 | import org.springframework.web.bind.annotation.ResponseBody; |
32 | 38 |
|
33 | | -import java.net.URI; |
34 | | -import java.util.List; |
35 | | -import java.util.Map; |
36 | | -import java.time.Instant; |
37 | | -import java.util.Objects; |
38 | | - |
39 | 39 | /** |
40 | 40 | * Global Exception handler for REST controllers. |
41 | 41 | * <p> |
@@ -66,7 +66,7 @@ private ProblemDetail detailBuild(Exception e, HttpStatus status, StringBuffer u |
66 | 66 | problemDetail.setTitle(e.getClass().getSimpleName()); |
67 | 67 | problemDetail.setDetail(detail); |
68 | 68 | problemDetail.setProperty("timestamp", Instant.now()); |
69 | | - problemDetail.setProperty("schemaValidationErrors", List.of()); |
| 69 | + problemDetail.setProperty("schemaValidationErrors", List.<ValidationMessageDto>of()); |
70 | 70 | return problemDetail; |
71 | 71 | } |
72 | 72 |
|
@@ -123,15 +123,19 @@ public ResponseEntity<ProblemDetail> handleMethodArgumentNotValidException(Metho |
123 | 123 | ProblemDetail detail = this.detailBuild(e, status, request.getRequestURL(), ERROR_INVALID_REQUEST); |
124 | 124 | if (bindingResult.hasErrors()) { |
125 | 125 | errors.addAllErrors(bindingResult); |
126 | | - List<Map<String, String>> schemaValidationErrors = bindingResult.getFieldErrors().stream() |
127 | | - .map(fieldError -> Map.of( |
128 | | - "field", fieldError.getField(), |
129 | | - "rejectedValue", Objects.toString(fieldError.getRejectedValue(), "null"), |
130 | | - "defaultMessage", Objects.toString(fieldError.getDefaultMessage(), "Validation failed"), |
131 | | - "message", "Field '%s' %s (rejected value: %s)".formatted( |
| 126 | + List<ValidationMessageDto> schemaValidationErrors = bindingResult.getFieldErrors().stream() |
| 127 | + .map(fieldError -> { |
| 128 | + String rejectedValue = Objects.toString(fieldError.getRejectedValue(), "null"); |
| 129 | + String defaultMessage = Objects.toString(fieldError.getDefaultMessage(), "Validation failed"); |
| 130 | + String message = "Field '%s' %s (rejected value: %s)".formatted( |
132 | 131 | fieldError.getField(), |
133 | | - Objects.toString(fieldError.getDefaultMessage(), "Validation failed"), |
134 | | - Objects.toString(fieldError.getRejectedValue(), "null")))) |
| 132 | + defaultMessage, |
| 133 | + rejectedValue); |
| 134 | + return new ValidationMessageDto(message) |
| 135 | + .putAdditionalProperty("field", fieldError.getField()) |
| 136 | + .putAdditionalProperty("rejectedValue", rejectedValue) |
| 137 | + .putAdditionalProperty("defaultMessage", defaultMessage); |
| 138 | + }) |
135 | 139 | .toList(); |
136 | 140 | logger.debug("Validation error at {} {}: {}", |
137 | 141 | request.getMethod(), |
|
0 commit comments