【发布时间】:2014-03-05 20:56:40
【问题描述】:
我想找到一种方法来确保如果创建了域模型对象,它在满足所有业务规则的含义上是有效的,例如:
- 客户有有效的联系地址
- 地址包含所有必填字段
- 等等
我有一个想法,让每个域对象模型都有自己的类,该类用作验证器类并用于验证实例是否有效。
public interface IValidator {
public boolean isValid();
}
AccountType 域模型类的接口实现简图:
public final class AccountTypeValidator implements IValidator {
private final AccountType accountType;
public AccountTypeValidator(final AccountType accountType) {
this.accountType = accountType;
}
public boolean isValidName() {
if (StringUtils.isBlank(accountType.getName()) == true) {
return false;
}
return true;
}
public final boolean isValid() {
if (isValidName() == false) {
return false;
}
return true;
}
}
当我在我的应用程序中使用这个验证类时,我可以做类似的事情:
public void setAccountType(final AccountType accountType) {
AccountTypeValidator validator = new AccountTypeValidator(accountType);
if (validator.isValid() == false) {
throw new IllegalArgumentException("....");
}
this.accountType = accountType;
}
优点:
- 为我的所有域模型定义自己的验证规则
- 验证我感兴趣的所有对象或具体字段
- 获取指示哪些字段无效的错误验证消息(并将其用作异常中的描述,例如)
缺点:
- 为所有域模型定义自己的验证规则
- 当我有很多对象(例如 AccountType 类的实例)时,我需要为所有对象创建新对象(资源消耗)
我确信没有必要重新发明轮子,所以我想问你是否有什么东西(库、最佳实践等)可以用来解决这种情况。我用谷歌搜索了“按合同设计”概念的原则,并在 SO 上找到了一些相应的主题,但我仍然不确定如何解决它的最佳方法是什么。
我想找到最简单的解决方案,消耗最少的系统资源的解决方案,易于使用并且在含义上稳健,以确保域模型对象有效。
【问题讨论】:
-
是否有原因导致 JSR-303
@Valid和相关注释无法满足您的需求? -
没有原因-我不知道,我去看看。
标签: java spring validation