JSR-303: un croisement de champ Validation problème
-
13-10-2019 - |
Question
J'ai une contrainte de @Money
qui indique la propriété Double
annotée est, eh bien, l'argent. J'ai écrit un ConstraintValidator
qui vérifie si une propriété @Money
a une valeur valide, qui dépend d'une instance de Currency
. Par exemple, USD a des valeurs en dollars et cent tandis que le yen japonais n'a pas, donc tout est 19.99 une valeur valide pour USD, ce n'est pas pour JPY. La valeur de Currency
est stocké dans une autre propriété de la même bean.
Le problème est à la recherche de la propriété Currency
d'un haricot donné dans le ConstraintValidator
. Je pensais à rendre la validation au niveau de la classe, mais il serait assez lourd et redondant d'écriture au niveau de la classe quels champs sont de l'argent, et plus important encore, vous ne pouvez générer un message d'erreur, même s'il y a plus d'une propriété de l'argent qui est non valide.
Toutes les suggestions, même de spécifiques Hibernate Validator sont les bienvenus.
Merci!
La solution
OMI, la solution la plus simple est de créer un Money
de dire de classe Java distincte qui contient à la fois des informations, le type d'argent (à savoir monnaie) et la valeur de l'argent.
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;
}
}
Après cela, créez un mot de contrainte @ValidMoney
et 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();
}
}
Exemple: -
public class Bid {
@ValidMoney
private Money bidAmount;
}