我正在尝试在 Play 2.1 上使用十进制数字变量创建一个对象。 我想使用注释设置验证,目前我所做的是:
import play.data.validation.Constraints.Max;
import play.data.validation.Constraints.Min;
@Max(10)
@Min(0.1)
public Float someNumber;
但它说不能将 double 转换为 long。 我怎样才能进行这种验证?
谢谢
最佳答案
您应该创建自己的 validator 。看一下 Max
和 Min
验证,这将帮助您开始通过扩展 AbstractAnnotationCheck
创建自己的 validator 。
以下是我为了能够注释 JPA 实体中的属性(如 @Decimal("15,2")
)所做的事情。
用作注释的接口(interface):
@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 方法以支持值 Object 参数的更多类型。您可能有一个 String
或 Long
或任何您希望能够使用此检查的内容。或者,在您的情况下是 Float
。
关于java - 使用 Play 对象验证十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15081851/