Вопрос

у меня есть @Money Ограничение, которое указывает на аннотированные Double Собственность, ну, деньги. Я написал ConstraintValidator что проверяет, если @Money свойство имеет допустимое значение, которое зависит от Currency пример. Например, у доллара США есть как доллар, так и ценные значения, тогда как японская иена этого не делает, поэтому, хотя 19,99 является допустимым значением для USD, это не для JPY. А Currency Значение хранится в другом свойстве того же бобов.

Проблема в том, чтобы искать Currency свойство данного боба в ConstraintValidator. Анкет Я подумал о том, чтобы сделать это проверкой на уровне класса, но было бы довольно громоздко и избыточно писать на уровне класса, что поля-деньги, и, что более важно, вы можете генерировать только одно сообщение об ошибке, даже если есть более одного денежного недвижимости это недействительно.

Любые предложения, даже специфичные для спящих валидаторов приветствуются.

Спасибо!

Это было полезно?

Решение

ИМО, самое простое решение - создать отдельный класс Java Money Это содержит как информацию, тип денег (т.е. валюта) и стоимость денег.

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;
    }

}

После этого создайте ограничение сказать @ValidMoney а также 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();
    }

}

Пример:-

public class Bid {
    @ValidMoney
    private Money bidAmount;    
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top