JSR-303: еще одна проблема проверки поля.
-
13-10-2019 - |
Вопрос
у меня есть @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;
}