2012-05-14 3 views
3

내 WebApplication을 Spring 3.0.5에서 3.1.1로 업그레이드 한 이후에 form-beans의 유효성을 검사 할 때 심각한 오류가 발생했습니다. 이전에 구성된 유효성 검사기가 더 이상 작동하지 않습니다. 문제는 그 방법 위해 GetFieldValue (문자열 필드 이름) 클래스 org.springframework.validation.Errors에서이해야한다 (그리고 예전)처럼 원래의 바인더 제본 빈 값을 반환하지 않습니다.Spring 3.1.1.RELEASE 데이터 바인딩 : 제출 된 양식의 유효성을 검사 할 때 오류가 발생했습니다.

이 내 폼 빈의 모습입니다 :

public class PersonBean extends BaseFormBean { 

private String firstname; // getters and setter omitted... 

    private String lastname; // getters and setter omitted... 

    private Integer age; // getters and setter omitted... 

    public PersonBean() {} 

    @Override 
    public void validateForm(Errors errors) { 
     WebValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstname", "validator.requiredvalidator.lbl", "field required"); 
     WebValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastname", "validator.requiredvalidator.lbl", "field required");  
     WebValidationUtils.rejectInvalidIntValue(errors, "age", "validator.std.age", "invalid age", false); 
    } 
} 

빈 속성을 확인하기 위해 사용되는 표준 방법을 가지고 호출됩니다 WebValidationUtils 수준. 이 오류는 String 유형이 아닌 값, Integer 유형의 특성 유효 기간과 같은 경우에만 발생합니다. 또한 콜렉션에서 발생합니다.

가 좀위한 추가적인 봄 콩을 구성해야합니까 ...

import org.springframework.validation.Errors; 
... 

public abstract class WebValidationUtils { 
... 
    public static void rejectInvalidIntValue(Errors errors, String field, String errorCode, String defaultMessage){ 
     Assert.notNull(errors, "Errors object must not be null"); 
     Object value = errors.getFieldValue(field); // returns the string value (type: java.lang.String) 
       Class<?> fieldType = errors.getFieldType(field); // returns the class Integer! 
     if (value == null || !value.getClass().equals(Integer.class) || ((Integer)value).intValue() <= 0){ 
       errors.rejectValue(field, errorCode, null, defaultMessage); 
     } 
    } 
} 

빈 (bean) 자체가 결합 된 올바른 값이 있습니다

다음 코드는 정수 값을 내 유틸 수준에서 검증하는 방법을 보여줍니다 내 context-servlet.xml에서 3.0.5와 같은 bevahior를 달성합니까?

편집 : 방법의 공식 Spring Doku는 "위해 GetFieldValue는 (...)"

반환 지정된 필드의 현재 값, 중 현재 빈 속성 값 또는 마지막 바인딩에서 거부 업데이 트를 말한다 .

그래서 나는이 방법 대신 정수 유형의 전파 빈 값의 문자열 값을 반환하는 이유 단서 ... 당신이 바인딩 오류가 그렇게 getFieldValue() 반환 FieldError.getFieldValue()을 가지고있는 것처럼

답변

1

보일를하지 않아도 바인딩 오류를 발생시키는 값을 리턴하십시오. 이것이 예상되는 동작입니다.

대신 getRawFieldValue()을 사용하여 속성을 보유하는 값을 가져올 수 있습니다. 이 메서드는 항상 PropertyAccessor을 사용하여 값을 반환합니다.

+0

오케이, 그 트릭을 했어. 내 유효성 검사 클래스에서 org.springframework.validation.BindingResult라는 다른 인터페이스를 사용해야했습니다. 이 인터페이스를 사용하면 getRawFieldValue (String 필드) 메소드에 액세스 할 수 있었고 bean 속성의 원래 값을 읽을 수있었습니다. 하지만 스프링 프레임 워크의 업데이트가이 호기심 많은 행동으로 이어지는 이유를 알 수는 없습니까? thx 많이 jose! –

관련 문제