gpt4 book ai didi

java - JSR-303 : Yet Another Cross-field Validation Problem

转载 作者:搜寻专家 更新时间:2023-11-01 03:13:42 26 4
gpt4 key购买 nike

我有一个 @Money 约束,指示带注释的 Double 属性是钱。我编写了一个 ConstraintValidator 来检查 @Money 属性是否具有有效值,这取决于 Currency 实例。例如,美元同时具有美元和美分值,而日元则没有,因此虽然 19.99 是美元的有效值,但不是日元。 Currency 值存储在同一 bean 的另一个属性中。

问题是在 ConstraintValidator 中查找给定 bean 的 Currency 属性。我想过让它成为类级别的验证,但是在类级别写哪些字段是金钱会很麻烦和多余,更重要的是,你只能生成一个错误消息,即使有不止一个金钱属性那是无效的。

欢迎任何建议,甚至是 Hibernate Validator 特定的建议。

谢谢!

最佳答案

IMO,最简单的解决方案是创建一个单独的 java 类,比如 Money,它包含信息、货币类型(即货币)和货币值(value)。

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

}

在此之后,创建一个约束 @ValidMoneyMoneyValidator

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

关于java - JSR-303 : Yet Another Cross-field Validation Problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com