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!

¿Fue útil?

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;    
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top