我有一个 @Money 指示注释的约束 Double 财产是金钱。我写了一个 ConstraintValidator 检查是否是 @Money 属性具有有效值,取决于 Currency 实例。例如,美元同时具有美元和百分比的价值,而日元则没有,因此,尽管19.99是美元的有效价值,但这并不适合JPY。这 Currency 值存储在同一bean的另一个属性中。

问题是查找 Currency 给定豆的属性 ConstraintValidator. 。我考虑过将其进行班级验证,但是在班级级别上写下哪个字段是金钱,更重要的是,即使您只能生成一个错误消息,即使有一个以上的资金属性,也很繁琐且多余那是无效的。

欢迎任何建议,甚至是冬眠验证者的特定建议。

谢谢!

有帮助吗?

解决方案

IMO,最简单的解决方案是创建一个单独的Java类Say 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