4

我有一个@Money约束,表明带注释的Double属性是钱。我写了一个ConstraintValidator检查一个@Money属性是否有一个有效值,这取决于一个Currency实例。例如,美元同时具有美元和美分价值,而日元则没有,因此虽然 19.99 是美元的有效值,但它不适用于日元。该Currency值存储在同一 bean 的另一个属性中。

问题是CurrencyConstraintValidator. 我想过做类级别的验证,但是在类级别写哪些字段是钱会很麻烦和多余,更重要的是,你只能生成一个错误消息,即使有多个钱属性那是无效的。

欢迎任何建议,甚至是特定于 Hibernate Validator 的建议。

谢谢!

4

1 回答 1

3

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

}

在此之后,创建一个约束说@ValidMoneyand 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 回答