0

在从此处记录的 BeanValidation 中学习时,我开始知道它@Digits支持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
 */

Digits 对 String 类型有何表现?将在什么基础@Digit上验证String类型?它的行为会像数字正则表达式验证(@Pattern)吗?

4

1 回答 1

1

JSR-303 定义了一个接口,因此您应该检查实现的功能。如果使用Hibernate Validator,支持@Digit 约束的String 的验证器是在DigitsValidatorForCharSequence 类中定义的(注意String 类实现了CharSequence 接口)。

该实现解析给定的字符串,如果它是有效的 BigDecimal,则验证器返回 true。

这是上述类中定义的 isValid 方法(以及用于解析值的私有方法):

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

于 2014-06-24T14:23:03.213 回答