2016-09-06 13 views
7

Próbuję umieścić sprawdzanie poprawności w projekcie Spring Boot. Dlatego wstawiam adnotację @NotNull do pól encji. W kontrolerze sprawdzam to tak:Wiosenny start, jak używać @Valid z listą <T>

@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, ""); 
} 

To działa. Ale kiedy robię to z wejściem List<Status> statuses, to nie działa.

@RequestMapping(value="/bulk", method = RequestMethod.POST) 
public List<DataResponse> bulkAdd(@RequestBody @Valid List<Status> statuses, BindingResult bindingResult) { 
    // some code here 
} 

Zasadniczo to, czego chcę, to zastosowanie sprawdzania poprawności, jak w metodzie dodawania do każdego obiektu Status na liście requestbody. Tak więc nadawca będzie teraz, które obiekty mają wadę, a które nie.

Jak mogę to zrobić w prosty i szybki sposób?

Odpowiedz

8

Moja bezpośrednia sugestia to zawinięcie listy do innego komponentu POJO. I użyj tego jako parametru treści żądania.

W twoim przykładzie.

@RequestMapping(value="/bulk", method = RequestMethod.POST) 
public List<DataResponse> bulkAdd(@RequestBody @Valid StatusList statusList, BindingResult bindingResult) { 
// some code here 
} 

i StatusList.java będzie

@Valid 
private List<Status> statuses; 
//Getter //Setter //Constructors 

ja nie spróbować choć.

Aktualizacja: Zaakceptowanych odpowiedź in this SO link daje dobre wyjaśnienie dlaczego walidacja fasola nie są obsługiwane na listach.

0

Po prostu zaznacz kontrolkę z adnotacją @Validated.

To rzuci ConstraintViolationException, więc prawdopodobnie chcesz mapować go 400: BAD_REQUEST:

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; 
    } 
}