您应该创建自己的验证器。看看Max
和Min
验证,这将让您开始通过扩展创建自己的验证器AbstractAnnotationCheck
。
这是我为能够注释 JPA 实体中的属性(如@Decimal("15,2")
.
用作注解的接口:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(checkWith = DecimalCheck.class)
public @interface Decimal {
String[] value() default {""};
String[] lang() default {"*"};
}
DecimalCheck 看起来像这样:
public class DecimalCheck extends AbstractAnnotationCheck<Decimal> {
public int digits = 0;
public int decimals = 0;
@Override
public void configure(Decimal number) {
String[] values = StringUtils.split(number.value()[0], ",");
if (values.length > 1) {
decimals = Integer.parseInt(values[1]);
digits = Integer.parseInt(values[0]) - decimals;
}
}
public boolean isSatisfied(Object validatedObject, Object value, OValContext context, Validator validator) {
value = play.data.validation.Validation.willBeValidated(value);
if (value == null || value.toString().length() == 0) {
return true;
}
if (value instanceof BigDecimal) {
BigDecimal number = (BigDecimal) value;
int numberOfDecimals = number.scale();
int numberOfDigits = String.valueOf(number.intValue()).length();
if (numberOfDecimals <= decimals && numberOfDigits <= digits) {
return true;
}
}
return false;
}
}
您当然可以扩展 isSatisfied 方法以支持 value Object 参数的更多类型。您可能有 aString
或 aLong
或任何您希望能够使用此检查的东西。或者,在您的情况下,一个Float
.