@RequestMapping(value = "/submit", method = RequestMethod.POST)
public String submitForm(CustomForm form) {
Set<ConstraintViolation<CustomForm>> errors = validator.validate(form);
BindingResult bindingResult = toBindingResult(errors, form, "form");
...
}
private BindingResult toBindingResult(ConstraintViolationException e, Object object, String objectName) {
BindingResult bindingResult = new BeanPropertyBindingResult(object, objectName);
new AddConstraintViolationsToErrors().addConstraintViolations(e.getConstraintViolations(), bindingResult);
return bindingResult;
}
private static class AddConstraintViolationsToErrors extends SpringValidatorAdapter {
public AddConstraintViolationsToErrors() {
super(Validation.buildDefaultValidatorFactory().getValidator()); // Validator is not actually used
}
@SuppressWarnings({"rawtypes", "unchecked"})
public void addConstraintViolations(Set<? super ConstraintViolation<?>> violations, Errors errors) {
// Using raw type since processConstraintViolations specifically expects ConstraintViolation<Object>
super.processConstraintViolations((Set) violations, errors);
}
}
Set<ConstraintViolation<?>>
この質問に対する他の回答とは異なり、このソリューションは、に変換する必要のあるがすでに存在する場合を処理しBindingResult
ます。
説明
Springは、SpringValidatorAdapter
Bean検証を実行するクラスを提供し、結果をインスタンスに格納します( extendsErrors
に注意してください)。このクラスの通常の手動使用は、次のメソッドを介して検証を実行するために使用することです。BindingResult
Errors
validate
Validator beanValidator = Validation.buildDefaultValidatorFactory().getValidator();
SpringValidatorAdapter validatorAdapter = new SpringValidatorAdapter(beanValidator);
BindException bindException = new BindException(form, "form");
validatorAdapter.validate(form, bindException);
Set<ConstraintViolation<?>>
ただし、これは、に変換する必要のあるがすでに存在する場合には役立ちませんBindingResult
。
この目標を達成することはまだ可能ですが、いくつかの追加のフープをジャンプする必要があります。 オブジェクトを適切なSpringサブタイプに変換し、それらをオブジェクトに格納SpringValidatorAdapter
するメソッドが含まれています。ただし、このメソッドは保護されているため、アクセスがサブクラスに制限されます。processConstraintViolations
ConstraintViolation
ObjectError
Errors
SpringValidatorAdapter
この制限は、保護されたメソッドに委任または公開するカスタムサブクラスを作成することで回避できます。これは一般的な使用法ではありませんが、機能します。
public class AddConstraintViolationsToErrors extends SpringValidatorAdapter {
public AddConstraintViolationsToErrors() {
super(Validation.buildDefaultValidatorFactory().getValidator()); // Validator is not actually used
}
@SuppressWarnings({"rawtypes", "unchecked"})
public void addConstraintViolations(Set<? super ConstraintViolation<?>> violations, Errors errors) {
// Using raw type since processConstraintViolations specifically expects ConstraintViolation<Object>
super.processConstraintViolations((Set) violations, errors);
}
}
このカスタムクラスを使用して、新しく作成されたを設定し、からBindingResult
を作成するという目標を達成できます。BindingResult
Set<ConstraintViolation<?>>
private BindingResult toBindException(ConstraintViolationException e, Object object, String objectName) {
BindingResult bindingResult = new BeanPropertyBindingResult(object, objectName);
new AddConstraintViolationsToErrors().addConstraintViolations(e.getConstraintViolations(), bindingResult);
return bindingResult;
}