4

注釈付きのプロパティがお金であることを@Money示す制約があります。インスタンスに依存する有効な値がプロパティにDoubleあるConstraintValidatorかどうかをチェックするを作成しました。たとえば、USDにはドルとセントの両方の値がありますが、日本円にはありません。したがって、19.99はUSDの有効な値ですが、JPYの値ではありません。値は、同じBeanの別のプロパティに格納されます。@MoneyCurrencyCurrency

問題は、Currency内の特定のBeanのプロパティを検索することConstraintValidatorです。クラスレベルの検証にすることを考えましたが、クラスレベルでフィールドがお金であると書くのは非常に面倒で冗長であり、さらに重要なことに、複数のお金のプロパティがある場合でも、1つのエラーメッセージしか生成できませんそれは無効です。

Hibernate Validator固有の提案であっても、どんな提案でも歓迎します。

ありがとう!

4

1 に答える 1

3

MoneyIMO、最も簡単な解決策は、情報、お金の種類(つまり、通貨)とお金の価値の両方を保持する別のJavaクラスsayを作成することです。

public class Money {

    private Currency currency;
    private Double value;

    public Currency getCurrency() { return currency; }
    public void setCurrency(Currency currency) { this.currency = currency; }

    public Double getValue() { return value; }
    public void setValue(Double value) { this.value = value; }

    public boolean isValid() {
        if(getCurrency() == null || getValue() == null) {
            return false;
        }

        // critical logic goes here

        // sample code
        if("JPY".equalsIgnoreCase(currency.getCurrencyCode())) {
            int intValue = getValue().intValue();
            double diff = getValue() - intValue;
            if(diff > 0) {
                return false;
            }
        }

        /*double fractionValue = value - (value % (currency.getDefaultFractionDigits() * 10));
        if(fractionValue > currency.getDefaultFractionDigits() * 10) {
            return false;
        }*/

        return true;
    }

}

この後、制約say@ValidMoneyとを作成しますMoneyValidator

public class MoneyValidator implements ConstraintValidator<ValidMoney, Money> {

    @Override
    public void initialize(ValidMoney constraintAnnotation) {
        // TODO Auto-generated method stub
    }

    @Override
    public boolean isValid(Money value, ConstraintValidatorContext context) {
        return value.isValid();
    }

}

例:-

public class Bid {
    @ValidMoney
    private Money bidAmount;    
}
于 2011-01-05T08:07:49.570 に答える