JSR-303:又一个跨领域验证问题

时间:2010-12-27 23:15:16

标签: java hibernate-validator bean-validation

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

问题是在Currency内查找给定bean的ConstraintValidator属性。我考虑过进行类级验证,但是在类级别编写哪些字段是金钱会非常麻烦和冗余,更重要的是,即使有多个资金属性,也只能生成一条错误消息这是无效的。

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

谢谢!

1 个答案:

答案 0 :(得分: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;
    }

}

在此之后,创建一个约束@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;    
}