2013-02-15 1 views
7

У меня есть следующий код в Spring контроллера:Преобразовать ошибки проверки JSR-303 для Спринга BindingResult

@Autowired 
private javax.validation.Validator validator; 

@RequestMapping(value = "/submit", method = RequestMethod.POST) 
public String submitForm(CustomForm form) { 
    Set<ConstraintViolation<CustomForm>> errors = validator.validate(vustomForm); 
    ... 
} 

Можно ли карта errors к BindingResult объекта Spring без вручную пройдя через все ошибки и добавляя их BindingResult? Что-то вроде этого:

// NOTE: this is imaginary code 
BindingResult bindingResult = BindingResult.fromConstraintViolations(errors); 

Я теперь можно аннотировать CustomForm параметр с @Valid и пусть Spring впрыснуть BindingResult в качестве параметра другого метода, но это не вариант в моем случае.

// I know this is possible, but doesn't work for me 
public String submitForm(@Valid CustomForm form, BindingResult bindingResult) { 
    ... 
} 

ответ

8

Более простой подход может быть использование абстракции Spring в org.springframework.validation.Validator вместо этого, вы можете разжиться валидатора, имея этот компонент в контексте:

<bean id="jsr303Validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 

@Autowired @Qualifier("jsr303Validator") Validator validator; 

С этой абстракции на месте, вы можете использовать валидатор таким образом, проходя в вашем bindingResult:

validator.validate(obj, bindingResult); 
+0

Спасибо! Это определенно более красноречиво. –

+3

Я не вижу метода validate, который принимает BindingResult – gstackoverflow

+1

Если вы не видите метод проверки, который принимает результаты привязки, это означает, что ваш валидатор Validator является javax.validation.Validator. Измените его на org.springframework.validation.Validator, и все будет в порядке. Нет необходимости изменять определение компонента. – Icegras

0

Spring использует SpringValidatorAdapter для преобразования объектов javax.validation.ConstraintViolation в ObjectError или FieldError, как показано в результате привязки. Затем BindStatus использует источник сообщений (например, сам контекст веб-приложения) для перевода ошибок. Короче говоря, вы можете сделать:

SpringValidatorAdapter springValidator = new SpringValidatorAdapter(validator); 
BindingResult bindingResult= new BeanPropertyBindingResult(myBeanToValidate, "myBeanName"); 
springValidator.validate(myBeanToValidate, bindingResult); 

Это проще при написании модульного теста, потому что вы даже не нужно, чтобы создать контекст Spring.