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!

Était-ce utile?

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;    
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top