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オブジェクトに適用することです。したがって、送信者は、どのオブジェクトに障害があり、どのオブジェクトに障害がないかを判断します。
どうすればこれを簡単かつ迅速に行うことができますか?
私の当面の提案は、リストを別の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検証の理由を説明していますリストではサポートされていません。
@RestController
@Validated
@RequestMapping("/products")
public class ProductController {
@PostMapping
@Validated(MyGroup.class)
public ResponseEntity<List<Product>> createProducts(
@RequestBody List<@Valid Product> products
) throws Exception {
....
}
}
コントローラに @ 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;
}
}