2014-06-24 3 views
0

문서화 된 here에서 BeanValidation을 연구하면서 @DigitsString 데이터 유형을 지원한다는 것을 알게되었습니다. 여기 문서에서 스냅 샷.@Digits 제약 (Bean Validation-JSR 303)이 String 유형을 지원하는 방법은 무엇입니까?

package javax.validation.constraints; 

/** 
* The annotated element must be a number within accepted range 
* Supported types are: 
* <ul> 
* <li><code>BigDecimal</code></li> 
* <li><code>BigInteger</code></li> 
* <li><code>String</code></li> 
* <li><code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code>, 
* and their respective wrapper types</li> 
* </ul> 
* <p/> 
* <code>null</code> elements are considered valid 
* 
* @author Emmanuel Bernard 
*/ 

숫자가 문자열 유형에 대해 어떻게 작용할 수 있습니까? 어떤 기초에 String 유형을 유효하게 할 것입니까? 숫자 정규 표현식 검증 (@Pattern)과 같이 동작합니까?

답변

1

JSR-303은 인터페이스를 정의하므로 구현 내용을 확인해야합니다. Hibernate Validator를 사용하면 @Digit 제약 조건을 지원하는 String의 유효성 검사기가 DigitsValidatorForCharSequence 클래스에 정의됩니다. String 클래스는 CharSequence 인터페이스를 구현합니다.

해당 구현은 주어진 String을 구문 분석하고 유효한 BigDecimal이면 유효성 검사기는 true를 반환합니다.

public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) { 
    //null values are valid 
    if (charSequence == null) { 
     return true; 
    } 

    BigDecimal bigNum = getBigDecimalValue(charSequence); 
    if (bigNum == null) { 
     return false; 
    } 

    int integerPartLength = bigNum.precision() - bigNum.scale(); 
    int fractionPartLength = bigNum.scale() < 0 ? 0 : bigNum.scale(); 

    return (maxIntegerLength >= integerPartLength && maxFractionLength >= fractionPartLength); 
} 

private BigDecimal getBigDecimalValue(CharSequence charSequence) { 
    BigDecimal bd; 
    try { 
     bd = new BigDecimal(charSequence.toString()); 
    } 
    catch (NumberFormatException nfe) { 
     return null; 
    } 
    return bd; 
} 

링크 소스 코드 : https://github.com/hibernate/hibernate-validator/blob/e20c12aa0aba6e2bf21a2da7cefd74d06c2e2710/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators/bv/DigitsValidatorForCharSequence.java

여기

는 상기 클래스에 정의 isValid 방법 (그 값을 해석하는 데 사용되는 전용 방식) 인