WebObjects/EOF/使用 EOF/验证
外观
mmalcolm 的 StepWise 文章名为“使用 WebObjects 5 进行数据验证”:http://www.stepwise.com/Articles/Technical/2001-06-13.01.html
WO 和 EOF 拥有令人难以置信的各种验证机制。以下是一些您可能会发现有用的笔记
- 用户界面
- 防止/阻止用户输入不适当的数据
- 格式化程序
- 格式化
- 只接受格式有效的數據
- 类型强制转换
- 类型错误会引发异常
- 简单验证
- 引发异常并忽略值
- 必须与当前值不同或未分配
- WOComponent 的 validationFailedWithException(Throwable t, Object value, String keyPath)
- 当企业对象或格式化程序在赋值期间验证失败时调用。
- 默认实现忽略错误。
- 子类可以覆盖以解决错误。
- 格式化
- 模型
- 属性约束
- 检查
- 允许空值
- 字符串长度
- 数字精度
- 关系完整性
- 在去数据库之前检查这些
- 检查
- 关系完整性约束
- 可选性
- 对于一对一和一对多
- 删除规则
- 如果源被删除,那么如何处理
- 所有权,拥有对象为
- 如果关系断开则删除
- 如果关系添加则创建
- 删除规则(如果用户尝试删除关系源)
- 级联 - 也删除所有目标对象
- 使无效 - 使反向引用无效
- 拒绝 - 如果存在目标对象,则禁止删除
- 无 - 删除并忽略目标对象
- 可选性
- 属性约束
- EO
- 属性级(或键级)验证
- 当值更改时调用
- 超类中的默认方法检查基于模型的约束
- 可以覆盖以进行自定义验证
- 在 EO 的属性更改之前调用
- 验证方法在失败时抛出异常
- validateValueForKey("weight") 触发:public <type> validateWeight(Object newWeight) throws NSValidation.ValidationException {
- 对象级验证
- 当保存插入/删除/更新更改时调用
- public void validateForInsert() throws NSValidation.ValidationException
- public void validateForUpdate() throws NSValidation.ValidationException
- public void validateForDelete() throws NSValidation.ValidationException
- 以上所有在超类中默认调用
- public void validateForSave() throws NSValidation.ValidationException
- 超类的实现调用键级验证
- 在 EO 的属性更改之后调用
- 当保存插入/删除/更新更改时调用
- 验证在以下情况下执行
- 表单值通过绑定推送到 EO 属性中
- 在编辑上下文中保存更改
- 以编程方式调用
- 属性级(或键级)验证
问题:我想在 EO 验证后但保存到图/数据库之前对其进行更改。这可能吗?
您不想这样做,您不应该这样做,而且框架会尽一切努力阻止您这样做。validateForSave 是对象存储的守门员。它的作用是确保只有通过验证的对象才能保存。在 validateForSave() 完成后修改对象图将违反其存在的根本原因。
我认为您有三种选择
- 在组件中执行
- 在 EO 中执行
- 在另一个对象中执行
我同意组件可能不是执行此操作的地方,我也不喜欢让我的 EO 调用 saveChanges()。您可能想考虑第三种选择,即拥有某种 ShiftManager 对象来负责监督班次的关闭和开启。它可以向页面提供有关什么有效以及有哪些选择的信息,并且它可以处理两阶段保存。
在我那样做之前,我会考虑其他一些选择。以下是一些可能激发您自己想法的想法
- 将重置现金盒余额推迟到下一班次开始之前。我上次当收银员的时候(谢天谢地,很久以前了),就是这样运作的。您交上您的现金托盘和差异说明,老板摇摇头,咕哝着。然后他记录了所有信息。对于下一个员工,他然后重新装满了现金抽屉。通常这要到第二天早上才会发生。
- 向 Shift 添加一个方法,如下所示
public void close() throws ValidationException { validateForSave(); cashBox().resetBalance(); }
在您的组件中
try { shift().close(); ec().saveChanges(); } catch (ValidationException v) { // do the right thing } catch (EOGeneralAdaptorException e) { // do the right thing }
- 我还有另一个想法,但它已经从我的脑海中消失了。 :-)