Как ограничение @Digits (проверка Bean-JSR 303) поддерживает строковый тип?

#java #bean-validation #digits #jsr

#java #проверка компонента #цифры #jsr

Вопрос:

Изучая BeanValidation из documented here, я узнал, что @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
 */
 

Как цифры могут вести себя для строкового типа? На какой основе @Digit будет проверяться String тип? Будет ли оно вести себя как проверка регулярных выражений цифр (@Pattern)?

Ответ №1:

JSR-303 определяет интерфейс, поэтому вы должны проверить, что делает реализация. Если вы используете средство проверки гибернации, средство проверки строки, поддерживающее ограничение @Digit, определяется в классе 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 amp;amp; 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