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!

War es hilfreich?

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;    
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top