JSR-303: Ein weiteres Cross-Field-Validierungsproblem
-
13-10-2019 - |
Frage
Ich habe ein @Money
Einschränkung, die die Annotierungen anzeigen Double
Eigentum ist, na ja, Geld. Ich habe a geschrieben ConstraintValidator
das überprüft, ob a @Money
Eigenschaft hat einen gültigen Wert, der von a abhängt Currency
Beispiel. Zum Beispiel hat USD sowohl Dollar- als auch Cent -Werte, während japanischer Yen es nicht tut. Während 19,99 ein gültiger Wert für USD ist, ist dies nicht für JPY. Das Currency
Der Wert wird in einer anderen Eigenschaft derselben Bohne gespeichert.
Das Problem ist, die nachzuschlagen Currency
Eigentum einer bestimmten Bohne innerhalb der ConstraintValidator
. Ich habe darüber nachgedacht, es zu validieren, aber es wäre ziemlich umständlich und überflüssig, auf Klassenebene zu schreiben, welche Felder Geld sind, und vor allem können Sie nur eine Fehlermeldung generieren, selbst wenn es mehr als eine Geldeigentum gibt Das ist ungültig.
Alle Vorschläge, selbst Hibernate Validator -spezifische, sind willkommen.
Vielen Dank!
Lösung
IMO, die einfachste Lösung besteht darin, eine separate Java -Klasse zu erstellen. Say sagen Money
Das enthält beide Informationen, die Art des Geldes (dh Währung) und den Wert des Geldes.
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;
}
}
Erstellen Sie danach eine Einschränkung sagen @ValidMoney
und 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();
}
}
Beispiel:-
public class Bid {
@ValidMoney
private Money bidAmount;
}