#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