質問

私は持っています @Money 注釈付きを示す制約 Double 財産は、まあ、お金です。私は書いた ConstraintValidator それはaをチェックします @Money プロパティには有効な値があり、これは Currency 実例。たとえば、USDにはドルとセントの両方の価値がありますが、日本の円はそうではないため、19.99はUSDの有効な値ですが、JPYではありません。 Currency 値は、同じ豆の別のプロパティに保存されます。

問題は見上げることです Currency 内部の特定の豆の特性 ConstraintValidator. 。私はそれをクラスレベルの検証にすることを考えましたが、クラスレベルでどのフィールドがお金であるかを書くのは非常に面倒で冗長であり、さらに重要なことには、複数のお金の財産があっても、1つのエラーメッセージしか生成できません。それは無効です。

どんな提案でも、Hibernate Balibator固有のものでさえ大歓迎です。

ありがとう!

役に立ちましたか?

解決

IMO、最も簡単な解決策は、別のJavaクラスを作成することです Money それは、情報、お金の種類(すなわち通貨)、およびお金の価値の両方を保持します。

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;
    }

}

この後、制約を作成します @ValidMoneyMoneyValidator.

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;    
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top