JSR-303:还有另一个跨场验证问题
-
13-10-2019 - |
题
我有一个 @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;
}
}
此后,创建一个约束说法 @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;
}
不隶属于 StackOverflow