2016-09-06 3 views
7

Я пытаюсь поставить проверку на проект Spring Boot. Поэтому я помещал аннотации @NotNull в Entity. В контроллере я проверяю это так:Spring boot, как использовать @Valid со списком <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, ""); 
} 

Это работает. Но когда я делаю это с вводом List<Status> statuses, он не работает.

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

В общем, что я хочу, чтобы применить проверки достоверности, как и в методе добавления к каждому объекту статуса в списке requestbody. Итак, отправитель будет теперь, какие объекты имеют ошибку, а какие нет.

Как я могу сделать это простым, быстрым способом?

ответ

8

Мое непосредственное предложение состоит в том, чтобы обернуть список в другой компонент POJO. И используйте это как параметр тела запроса.

В вашем примере.

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

и StatusList.java будет

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

Я не пробовал, хотя.

Update: Принятый ответ in this SO link дает хорошее объяснение того, почему проверки боб не поддерживаются на списках.

0

Просто отметьте контроллер @Validated аннотация.

Он будет бросать ConstraintViolationException, поэтому, вероятно, вы хотите, чтобы отобразить его на 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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^