JSR-303: ancora un altro Cross-Validation campo Problem
-
13-10-2019 - |
Domanda
Ho un vincolo @Money
che indica la proprietà Double
annotato è, beh, i soldi. Ho scritto un ConstraintValidator
che controlla se una proprietà @Money
ha un valore valido, che dipende da un'istanza Currency
. Ad esempio, USD ha sia valori in dollari e centesimi che Yen non, così mentre 19,99 è un valore valido per USD, non è per JPY. Il valore Currency
è memorizzato in un'altra proprietà dello stesso bean.
Il problema è la ricerca di proprietà Currency
di una data di fagioli all'interno del ConstraintValidator
. Ho pensato di fare lo convalida a livello di classe, ma sarebbe abbastanza ingombrante e ridondante di scrivere a livello di classe che i campi sono i soldi, e più importante, è possibile generare solo un messaggio di errore, anche se c'è più di una proprietà soldi che non è valido.
Tutti i suggerimenti, anche quelli specifici Hibernate Validator sono i benvenuti.
Grazie!
Soluzione
IMO, la soluzione più semplice è quella di creare un dire Money
classe Java separato che contiene sia le informazioni, il tipo di denaro (cioè valuta) e il valore del denaro.
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;
}
}
Dopo questo, creare un vincolo @ValidMoney
voce e 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();
}
}
Esempio: -
public class Bid {
@ValidMoney
private Money bidAmount;
}