2013-02-15 13 views
7
JSR-303 doğrulama hataları dönüştürme

Spring denetleyicisi aşağıdaki kod var:Spring'in 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); 
    ... 
} 

mümkün elle bütün hataları geçiyor ve onları eklemeden Spring'in BindingResult nesneye errors haritaya mı BindingResult? Böyle bir şey:

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

Ben şimdi @Valid ile CustomForm parametreyi açıklama ve Bahar başka yöntemin parametresi olarak BindingResult enjekte izin mümkündür, ama bu benim durumumda bir seçenek yok.

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

cevap

8

Daha basit bir yaklaşım yerine Spring'in soyutlama org.springframework.validation.Validator kullanmak olabilir, bir bağlamda bu fasulye alarak bir doğrulayıcı elde edebilirler:

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

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

etapta bu soyutlama ile, kullanabilirsiniz senin BindingResult geçen doğrulayıcı bu şekilde:

validator.validate(obj, bindingResult); 
+0

Teşekkürler! Bu kesinlikle daha özlü. –

+3

BindingResult – gstackoverflow

+1

'u kabul eden yöntem doğrulamasını göremiyorum Bağlama sonuçlarını kabul eden doğrulama yöntemini göremiyorsanız, bu, Validator doğrulayıcınızın bir javax.validation.Validator olduğu anlamına gelir. Bir org.springframework.validation.Validator olarak değiştirin ve iyi olacaksınız. Fasulye tanımını değiştirmeye gerek yok. – Icegras

0

Bahar için javax.validation.ConstraintViolation nesneleri dönüştürmek için bir SpringValidatorAdapter kullanır Bağlama sonucunda bulunan ObjectError veya FieldError nesneleri. BindStatus daha sonra hataları çevirmek için bir mesaj kaynağı (web uygulaması içeriğinin kendisi gibi) kullanır. Kısacası , bunu yapabilirsiniz: hatta bir bahar bağlam oluşturmak gerekmez, çünkü bir birim testi yazarken

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

Bu daha kolaydır.

İlgili konular