跳转到内容

WebObjects/EOF/使用 EOF/验证

来自维基教科书,开放世界中的开放书籍

http://developer.apple.com/documentation/WebObjects/Enterprise_Objects/BusinessLogic/chapter_4_section_4.html

mmalcolm 的 StepWise 文章名为“使用 WebObjects 5 进行数据验证”:http://www.stepwise.com/Articles/Technical/2001-06-13.01.html

Jerry W. Walker

[编辑 | 编辑源代码]

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

[编辑 | 编辑源代码]

问题:我想在 EO 验证后但保存到图/数据库之前对其进行更改。这可能吗?

Chuck Hill

[编辑 | 编辑源代码]

您不想这样做,您不应该这样做,而且框架会尽一切努力阻止您这样做。validateForSave 是对象存储的守门员。它的作用是确保只有通过验证的对象才能保存。在 validateForSave() 完成后修改对象图将违反其存在的根本原因。

我认为您有三种选择

  1. 在组件中执行
  2. 在 EO 中执行
  3. 在另一个对象中执行

我同意组件可能不是执行此操作的地方,我也不喜欢让我的 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
 }
  • 我还有另一个想法,但它已经从我的脑海中消失了。 :-)
华夏公益教科书