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!

È stato utile?

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;    
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top