JSR-303:さらに別のクロスフィールド検証問題
-
13-10-2019 - |
質問
私は持っています @Money
注釈付きを示す制約 Double
財産は、まあ、お金です。私は書いた ConstraintValidator
それはaをチェックします @Money
プロパティには有効な値があり、これは Currency
実例。たとえば、USDにはドルとセントの両方の価値がありますが、日本の円はそうではないため、19.99はUSDの有効な値ですが、JPYではありません。 Currency
値は、同じ豆の別のプロパティに保存されます。
問題は見上げることです Currency
内部の特定の豆の特性 ConstraintValidator
. 。私はそれをクラスレベルの検証にすることを考えましたが、クラスレベルでどのフィールドがお金であるかを書くのは非常に面倒で冗長であり、さらに重要なことには、複数のお金の財産があっても、1つのエラーメッセージしか生成できません。それは無効です。
どんな提案でも、Hibernate Balibator固有のものでさえ大歓迎です。
ありがとう!
解決
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;
}
所属していません StackOverflow