Ich versuche, ein Spring Boot-Projekt zu validieren. Also habe ich @NotNull
Annotation in Entity-Felder eingefügt. Im Controller überprüfe ich es so:
@RequestMapping(value="", method = RequestMethod.POST)
public DataResponse add(@RequestBody @Valid Status status, BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
return new DataResponse(false, bindingResult.toString());
}
statusService.add(status);
return new DataResponse(true, "");
}
Das funktioniert. Aber wenn ich es mit Eingabe List<Status> statuses
mache, funktioniert es nicht.
@RequestMapping(value="/bulk", method = RequestMethod.POST)
public List<DataResponse> bulkAdd(@RequestBody @Valid List<Status> statuses, BindingResult bindingResult) {
// some code here
}
Im Grunde möchte ich die Validierungsprüfung wie in der add-Methode für jedes Status-Objekt in der Requestbody-Liste anwenden. Der Sender wird nun also wissen, welche Objekte fehlerhaft sind und welche nicht.
Wie mache ich das auf einfache und schnelle Weise?
Mein unmittelbarer Vorschlag ist, die Liste in eine andere POJO-Bohne zu packen. Und verwenden Sie dies als Parameter für den Anforderungstext.
In deinem Beispiel.
@RequestMapping(value="/bulk", method = RequestMethod.POST)
public List<DataResponse> bulkAdd(@RequestBody @Valid StatusList statusList, BindingResult bindingResult) {
// some code here
}
und StatusList.Java wird sein
@Valid
private List<Status> statuses;
//Getter //Setter //Constructors
Ich habe es aber nicht probiert.
Update: Die akzeptierte Antwort in diesem SO -Link gibt eine gute Erklärung dafür, warum Bean-Validierung in Listen nicht unterstützt wird.
Markieren Sie den Controller einfach mit @Validated annotation.
Es wird ConstraintViolationException
werfen, so dass Sie es wahrscheinlich zu 400: BAD_REQUEST
zuordnen wollen:
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice(annotations = Validated.class)
public class ValidatedExceptionHandler {
@ExceptionHandler
public ResponseEntity<Object> handle(ConstraintViolationException exception) {
List<String> errors = exception.getConstraintViolations()
.stream()
.map(this::toString)
.collect(Collectors.toList());
return new ResponseEntity<>(new ErrorResponseBody(exception.getLocalizedMessage(), errors),
HttpStatus.BAD_REQUEST);
}
private String toString(ConstraintViolation<?> violation) {
return Formatter.format("{} {}: {}",
violation.getRootBeanClass().getName(),
violation.getPropertyPath(),
violation.getMessage());
}
public static class ErrorResponseBody {
private String message;
private List<String> errors;
}
}