2013-02-15 1 views
7
에 JSR-303의 유효성 검사 오류를 변환

I 봄 컨트롤러에 다음 코드가 있습니다봄의 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); 
    ... 
} 

이 가능 수동으로 모든 오류를 통과하고에 추가하지 않고 봄의 BindingResult 개체에 errors를 매핑하는 것입니다 BindingResult? 이런 식으로 뭔가 :

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

내가 지금은 @ValidCustomForm 매개 변수를 주석과 봄은 다른 방법의 매개 변수로 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

BindingResult를 허용하는 메서드 validate가 표시되지 않습니다. – gstackoverflow

+1

바인딩 결과를 받아들이는 validate 메서드가 표시되지 않으면 유효성 검사기 검사기가 javax.validation.Validator임을 의미합니다. org.springframework.validation.Validator로 변경하면 괜찮을 것입니다. Bean 정의를 변경할 필요가 없습니다. – Icegras

0

봄에 javax.validation.ConstraintViolation 객체를 변환하는 SpringValidatorAdapter를 사용 바인딩 결과에있는 ObjectError 또는 FieldError 객체 그런 다음 BindStatus는 웹 응용 프로그램 컨텍스트 자체와 같은 메시지 소스를 사용하여 오류를 변환합니다. 한마디로 , 당신은 할 수 있습니다 : 당신은 심지어 Spring 컨텍스트를 만들 필요가 없기 때문에, 단위 테스트를 작성할 때

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

이 용이하다.