2013-02-15 5 views
7

Mam następujący kod w kontrolerze Wiosna:Konwersja błędy sprawdzania poprawności JSR-303 do sprężyny 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); 
    ... 
} 

Czy można mapować errors do wiosennego BindingResult obiektu bez konieczności ręcznego przechodzenia przez wszystkich błędów i dodanie ich do BindingResult? Coś takiego:

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

Teraz możliwe jest opisywanie CustomForm parametr z @Valid i niech Wiosna wstrzyknąć BindingResult jako parametr innej metody, ale nie jest to rozwiązanie w moim przypadku.

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

Odpowiedz

8

Prostsze podejście mogłoby być wykorzystanie Wiosny abstrakcję org.springframework.validation.Validator zamiast można zdobyć weryfikatora poprzez tę fasolkę w kontekście:

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

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

Z tej abstrakcji w miejscu, można użyć walidator ten sposób, przechodząc w bindingResult:

validator.validate(obj, bindingResult); 
+0

Dzięki! To zdecydowanie bardziej zwięzłe. –

+3

Nie widzę metody sprawdzania poprawności akceptującej BindingResult – gstackoverflow

+1

Jeśli nie widzisz metody sprawdzania poprawności, która akceptuje wyniki wiązania, oznacza to, że walidator walidatora to javax.validation.Validator. Zmień go na org.springframework.validation.Validator, a wszystko będzie dobrze. Nie trzeba zmieniać definicji fasoli. – Icegras

0

Wiosna używa SpringValidatorAdapter przekonwertować do obiektów javax.validation.ConstraintViolation Obiekty ObjectError lub FieldError, znalezione w wyniku wiązania. BindStatus używa następnie źródła wiadomości (takiego jak sam kontekst aplikacji internetowej) do tłumaczenia błędów. W skrócie, można zrobić:

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

Jest to łatwiejsze, gdy pisanie testów jednostkowych, bo nawet nie trzeba tworzyć kontekst wiosnę.