# 对象客制化(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
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
2
3
4
# 执行记录
每次执行对象客制化都会写入 DynamicObjectHookExecRecord,可以在 执行记录 > 对象客制化 中查看执行参数、执行结果、执行日志、状态和错误堆栈。该记录与动态逻辑的 enableLog 设置无关。
提示
1.0 起已移除"接口返回数据客制化(Object render)"类型(改写接口返回的数据请使用表单的 Data Hook)。