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;
}
これ。また、金額にdoubleやfloatを使用しないでください。与えられたcurrencの最小金額を数えるlongを使用してください。 –
私はこの解決法について実際には考えましたが、永続クラスで使用されるため、プリミティブ型に固執したいと考えました。あなたはいくつかのインターフェースを実装することによってHibernateにカスタムタイプを永続させることができますが、それが必要であるかどうかは確かではありません。それにもかかわらずありがとう。 –
ところで、あなたは 'MoneyValidator'を取り除き、' Bid'クラスの '@ Valid'アノテーションと' Money.isValid() 'の' @ AssertTrue'で置き換えることができます。 –