Skip to content

Commit 306a2e3

Browse files
committed
"fix(advice): Map validation errors to ValidationMessageDTO instead of generic maps.
1 parent 9d1e93e commit 306a2e3

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616

1717
package org.springframework.samples.petclinic.rest.advice;
1818

19+
import java.net.URI;
20+
import java.time.Instant;
21+
import java.util.List;
22+
import java.util.Objects;
23+
1924
import jakarta.servlet.http.HttpServletRequest;
2025
import org.slf4j.Logger;
2126
import org.slf4j.LoggerFactory;
@@ -24,18 +29,13 @@
2429
import org.springframework.http.ProblemDetail;
2530
import org.springframework.http.ResponseEntity;
2631
import org.springframework.samples.petclinic.rest.controller.BindingErrorsResponse;
32+
import org.springframework.samples.petclinic.rest.dto.ValidationMessageDto;
2733
import org.springframework.validation.BindingResult;
2834
import org.springframework.web.bind.MethodArgumentNotValidException;
2935
import org.springframework.web.bind.annotation.ControllerAdvice;
3036
import org.springframework.web.bind.annotation.ExceptionHandler;
3137
import org.springframework.web.bind.annotation.ResponseBody;
3238

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-
3939
/**
4040
* Global Exception handler for REST controllers.
4141
* <p>
@@ -66,7 +66,7 @@ private ProblemDetail detailBuild(Exception e, HttpStatus status, StringBuffer u
6666
problemDetail.setTitle(e.getClass().getSimpleName());
6767
problemDetail.setDetail(detail);
6868
problemDetail.setProperty("timestamp", Instant.now());
69-
problemDetail.setProperty("schemaValidationErrors", List.of());
69+
problemDetail.setProperty("schemaValidationErrors", List.<ValidationMessageDto>of());
7070
return problemDetail;
7171
}
7272

@@ -123,15 +123,19 @@ public ResponseEntity<ProblemDetail> handleMethodArgumentNotValidException(Metho
123123
ProblemDetail detail = this.detailBuild(e, status, request.getRequestURL(), ERROR_INVALID_REQUEST);
124124
if (bindingResult.hasErrors()) {
125125
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(
132131
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+
})
135139
.toList();
136140
logger.debug("Validation error at {} {}: {}",
137141
request.getMethod(),

0 commit comments

Comments
 (0)