0

Play2.1で10進数の変数を使用してオブジェクトを作成しようとしています。アノテーションを使用して検証を設定したいのですが、現在私が行ったことは次のとおりです。

import play.data.validation.Constraints.Max;
import play.data.validation.Constraints.Min;
@Max(10)
@Min(0.1)
public Float someNumber; 

しかし、それはダブルをロングに変換することはできないと言った。この種の検証をどのように行うことができますか?

ありがとうございました

4

2 に答える 2

1

独自のバリデーターを作成する必要があります。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メソッドを拡張して、値Objectパラメーターのより多くのタイプをサポートすることもできます。このチェックをオンにできるようにしたい、Stringまたは、または何でも持っている可能性があります。Longまたは、あなたの場合はFloat

于 2013-02-26T10:30:05.040 に答える
1

これが私が最後にしたことです...

@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = DoubleMinValidator.class)
@play.data.Form.Display(name="constraint.min", attributes={"value"})
public @interface DoubleMin {
    String message() default DoubleMinValidator.message;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    double value();
}


public class DoubleMinValidator extends Validator<Number> implements ConstraintValidator<DoubleMin, Number> {

    final static public String message = "error.min";
    private double min;

    public DoubleMinValidator() {}

    public DoubleMinValidator(double value) {
        this.min = value;
    }

    public void initialize(DoubleMin constraintAnnotation) {
        this.min = constraintAnnotation.value();
    }

    public boolean isValid(Number object) {
        if(object == null) {
            return true;
        }

        return object.doubleValue() >= min;
    }

    public Tuple<String, Object[]> getErrorMessageKey() {
        return Tuple(message, new Object[] { min });
    }

}

そして、@ DoubleMin(0.5)publicDoublenumを呼び出します。

マックスでも同じことをします。

于 2013-03-07T04:44:07.917 に答える