webentwicklung-frage-antwort-db.com.de

Spring Boot, wie man @Valid mit List <T> verwendet

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?

8
kalahari

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.

10
Ameen.M

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;
    }
}
0
Max Farsikov