我有一个@Money
约束,表明带注释的Double
属性是钱。我写了一个ConstraintValidator
来检查@Money
属性是否具有有效值,这取决于Currency
实例。例如,美元既有美元和美分,而日元没有,所以虽然19.99是美元的有效价值,但不是日元。 Currency
值存储在同一个bean的另一个属性中。
问题是在Currency
内查找给定bean的ConstraintValidator
属性。我考虑过进行类级验证,但是在类级别编写哪些字段是金钱会非常麻烦和冗余,更重要的是,即使有多个资金属性,也只能生成一条错误消息这是无效的。
任何建议,甚至是特定的Hibernate Validator都是受欢迎的。
谢谢!
答案 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;
}
}
在此之后,创建一个约束@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;
}