JSR-303: еще одна проблема валидации - PullRequest
4 голосов
/ 28 декабря 2010

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

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

Приветствуются любые предложения, даже специфичные для Hibernate Validator.

Спасибо!

1 Ответ

3 голосов
/ 05 января 2011

ИМО, самое простое решение - создать отдельный класс 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;    
}
...