# 对象客制化(Object Hook)

对象客制化用于在对象(领域模型记录)创建、更新、删除的前后插入自定义逻辑,例如创建前补全字段、更新前校验数据、删除后同步其他系统。

# 目标读者

本文档的目标读者为:本系统的开发和实施人员

# 定义

对象客制化通过菜单 开发定制 > 对象客制化 维护(对象 DynamicObjectHook),每次执行都会在 执行记录 > 对象客制化 中留下一条记录。

新建对象客制化

字段 说明
名称(name) 必填,唯一,创建后不可修改
类型(hookType) 客制化的时机,见下表。下拉框中显示英文名称
关联对象类型(objectType) 作用的领域模型,创建后不可修改
描述(description) 说明
核心逻辑(coreLogic) 类型为 OBJECT_DYNAMIC_HOOK 的动态逻辑
是否生效中(active) 只有生效中的客制化才会执行。新建表单中该开关默认关闭,需要手动打开

类型(ObjectHookType)的取值如下:

类型 下拉框显示 执行时机
BEFORE_CREATE Before creating 创建保存前:对象已在内存中构建完成,尚未保存到数据库,id 为空
AFTER_CREATE After creating 创建保存后:对象已保存、id 已生成,事务尚未提交
BEFORE_UPDATE Before updating 更新保存前:对象已按提交的数据更新,尚未保存到数据库
AFTER_UPDATE After updating 更新保存后,事务尚未提交
BEFORE_DELETE Before deleting 删除前:对象已从数据库查出,尚未删除
AFTER_DELETE After deleting 删除后,事务尚未提交
CREATE Create ability 动态创建权限,见 对象权限控制
UPDATE_DELETE Update/delete ability 动态修改和删除权限。当前版本平台不会执行该类型的客制化

CSV 种子数据的表头如下:

objectType.shortName,name(*),hookType,coreLogic.name,active,isSystem,description
1

提示

  • 同一个对象、同一种类型可以配置多个客制化,它们都会执行,执行顺序不做保证。
  • 平台按"对象 + 类型"缓存客制化列表,缓存最长保留 1 分钟。增删改客制化后,平台立即刷新该客制化当前类型对应的缓存;如果修改了客制化的类型,原类型的缓存不会立即刷新,最多 1 分钟内它仍会按原类型执行。

# 注入变量

# 创建

变量名称 变量类型 描述
object <? extends GormEntity> 待创建的对象实例
requestData Map 前端提交的原始数据
userContext tech.muyan.api.security.MuyanAuthentication 当前操作的用户信息
application grails.core.GrailsApplication 当前的 grails 应用上下文
log Closure 打印执行日志,内容保存到执行记录
hookType tech.muyan.enums.ObjectHookType 当前执行的客制化类型

# 更新

变量名称 变量类型 描述
oldObject <? extends GormEntity> 更新前的对象,在独立的 Session 中从数据库重新读取
newObject <? extends GormEntity> 按提交数据更新后的对象实例
requestData Map 前端提交的原始数据
userContext tech.muyan.api.security.MuyanAuthentication 当前操作的用户信息
application grails.core.GrailsApplication 当前的 grails 应用上下文
log Closure 打印执行日志,内容保存到执行记录
hookType tech.muyan.enums.ObjectHookType 当前执行的客制化类型

# 删除

变量名称 变量类型 描述
object <? extends GormEntity> 待删除的对象
userContext tech.muyan.api.security.MuyanAuthentication 当前操作的用户信息
application grails.core.GrailsApplication 当前的 grails 应用上下文
log Closure 打印执行日志,内容保存到执行记录
hookType tech.muyan.enums.ObjectHookType 当前执行的客制化类型

# 返回结果及异常处理

创建、更新、删除类客制化的返回值只会记录到执行记录中,平台不会用返回值修改对象。需要修改数据时,在"保存前"的客制化中直接修改 object(创建)或 newObject(更新)实例,修改会随本次操作一起保存:

// BEFORE_CREATE:新客户默认信用额度
if (object.creditLimit == null) {
  object.creditLimit = 10000
}
1
2
3
4

客制化代码可以通过抛出异常来中断操作或给出警告。平台按异常的实际类名判断,不认子类:

抛出的异常 结果
tech.muyan.exception.CustomLogicInterruptException 操作被中断,事务回滚,异常消息作为错误显示给用户。执行记录的状态为 SUCCESS(主动中断不算执行失败)
tech.muyan.exception.CustomLogicWarningException 操作继续执行,异常消息作为警告显示给用户。执行记录的状态为 SUCCESS_WITH_WARNING
其他任何异常(包括上面两个类的子类) 操作被中断,事务回滚,执行记录的状态为 FAILED;显示给用户的错误消息包含原异常的类名和消息
// BEFORE_DELETE:已审核的单据不允许删除
if (object.status == 'APPROVED') {
  throw new tech.muyan.exception.CustomLogicInterruptException("已审核的单据不能删除")
}
1
2
3
4

# 执行记录

每次执行对象客制化都会写入 DynamicObjectHookExecRecord,可以在 执行记录 > 对象客制化 中查看执行参数、执行结果、执行日志、状态和错误堆栈。该记录与动态逻辑的 enableLog 设置无关。

提示

1.0 起已移除"接口返回数据客制化(Object render)"类型(改写接口返回的数据请使用表单的 Data Hook)。

Last Updated: 2026/9/24 14:27:35