web-dev-qa-db-ja.com

Spring Boot、List <T>で@Validを使用する方法

SpringBootプロジェクトに検証を加えようとしています。だから私は@NotNullエンティティフィールドへの注釈。コントローラでは、次のようにチェックします。

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

基本的に、私が欲しいのは、addメソッドのような検証チェックをrequestbodyリストの各Statusオブジェクトに適用することです。したがって、送信者は、どのオブジェクトに障害があり、どのオブジェクトに障害がないかを判断します。

どうすればこれを簡単かつ迅速に行うことができますか?

9
kalahari

私の当面の提案は、リストを別のPOJOBeanでラップすることです。そして、それをリクエストの本文パラメータとして使用します。

あなたの例では。

@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

私はそれを試しませんでした。

更新:受け入れられた答え このSOリンク は、Bean検証の理由を説明していますリストではサポートされていません。

12
Ameen.M
@RestController
@Validated
@RequestMapping("/products")
    public class ProductController {
        @PostMapping
        @Validated(MyGroup.class)
        public ResponseEntity<List<Product>> createProducts(
            @RequestBody List<@Valid Product> products
        ) throws Exception {
            ....
        }
}
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;
    }
}
0
Max Farsikov