JSR-303: otro cruce campo Validación Problema
-
13-10-2019 - |
Pregunta
Tengo una restricción @Money
que indica la propiedad Double
anotada es, así, el dinero. Escribí un ConstraintValidator
que comprueba si una propiedad @Money
tiene un valor válido, que depende de una instancia Currency
. Por ejemplo, USD tiene dos valores en dólares y centavos, mientras que el yen japonés no, así que mientras que 19.99 es un valor válido para el USD, que no es para JPY. El valor Currency
se almacena en otra propiedad del mismo bean.
El problema es buscar la propiedad Currency
de un grano dado dentro de la ConstraintValidator
. Pensé en lo que es la validación de nivel de clase, pero sería bastante engorroso y redundante a escribir en el nivel de clase que los campos son dinero, y lo más importante, sólo se puede generar un mensaje de error, incluso si hay más de una propiedad de dinero que no es válido.
Cualquier sugerencia, incluso los específicos de Hibernate Validator son bienvenidos.
Gracias!
Solución
IMO, the simplest solution is to create a separate java class say Money
that holds both information, the type of money (i.e. Currency) and the value of 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;
}
}
After this, create a constraint say @ValidMoney
and 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();
}
}
Example:-
public class Bid {
@ValidMoney
private Money bidAmount;
}