CE 更新事件:有啥方法可以将之前/之后的属性值传递给工作流?
Posted
技术标签:
【中文标题】CE 更新事件:有啥方法可以将之前/之后的属性值传递给工作流?【英文标题】:CE Update Event: any way to pass before/after property values to a workflow?CE 更新事件:有什么方法可以将之前/之后的属性值传递给工作流? 【发布时间】:2018-07-29 02:44:13 【问题描述】:我已经为添加、更新和删除事件配置了 FileNet 工作流订阅。工作流调用 Java 组件来发送通知消息(给第三方)。
我们希望在“更新”事件的通知消息中看到“之前”和“之后”属性值。
触发订阅的“Event”对象有一个“Modified Properties”成员,所以我希望我可以在工作流中创建一个相应的“ModifiedProperties”字符串数组,并拥有订阅映射“Update.ModifiedProperties = ModifiedProperties” ”。不幸的是,事件的“ModifiedProperties”只给出了 NEW 值,而不是“之前”值。
看起来“UpdateEvent”对象也有一个“OriginalObject”成员......我也许可以使用 Java API 从 OriginalObject 获取“之前”值。
问:这种获取文档前/后属性值的方法听起来是否合理?
问:任何想法如何将“OriginalObject”对象从订阅传递到工作流,以便 Java 组件可以使用它?
目标平台是P8 5.2.1;我正在 P8 5.5 上开发。
【问题讨论】:
您是否已经拥有自定义工作流组件? 答:是的。问题是“自定义组件如何在'更新'之前/之后获取属性值”? user9628593 给了我一个很好的建议。但似乎没有任何方法可以在更改之前/之后传递 - 或将 OriginalObject - 直接从工作流订阅传递到工作流。没有一些“中间步骤”。就像一个自定义 CE 事件处理程序,它创建一个 CustomObject 来传递信息。 我不认为这是一个特别好的建议,因为它只不过是偶然的复杂性。您的任务应通过创建自定义EventAction
来解决,该EventAction
将启动所需的工作流实例。在该操作中,您将能够随意初始化它,即使用来自 OriginalObject
属性的数据。或者,您可以使用审核将更新事件持久保存在存储库中。但是系统启用审计可能太繁重了。
【参考方案1】:
你是对的,获取原始值的唯一方法是通过 OriginalObject 对象。将数据获取到工作流的最快方法是使用可订阅对象。
因此,解决您的问题的方法是定义一个自定义对象,其中包含描述新旧属性值的属性。您在文档中的更新事件触发的自定义事件处理程序中创建此自定义对象。在这里,您可以使用原始对象填充自定义对象的属性:
Document document = (Document) event.get_OriginalObject();;
Iterator<?> iterator = event.get_ModifiedProperties().iterator();
while (iterator.hasNext())
String modifiedProperty = (String) iterator.next();
// TODO: Fetch the values from the original object
// and set them on the custom object. The details depend
// on the data structure you choose.
接下来,您创建一个在自定义对象的创建 时触发的工作流订阅。您可以将自定义对象的属性映射到工作流的数据字段。在启动的工作流中,您可以定义附件并指定自定义对象是启动附件。使用 CE_Operation 队列方法,您现在可以在处理完成时删除自定义对象。
【讨论】:
完美 - 谢谢。关键是我 不能 仅通过工作流订阅以某种方式在值之前/之后进行通信。我必须有一个(例如 Java)自定义事件处理程序才能工作。【参考方案2】:if(objEvent instanceof UpdateEvent) try String strModifiedProperties = ""; UpdateEvent updateEvent = (UpdateEvent) objEvent; StringList propertyNames = updateEvent.get_ModifiedProperties(); Iterator iterModifiedProps = propertyNames.iterator(); while(iterModifiedProps.hasNext()) String modifiedProperty = (String) iterModifiedProps.next(); strModifiedProperties = strModifiedProperties+modifiedProperty+","; strModifiedProperties = strModifiedProperties.substring(0, strModifiedProperties.lastIndexOf(",")); catch (Exception e) System.out.println("onEvent : Exception while executing UpdateEvent: "+e.getMessage());
【讨论】:
您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。以上是关于CE 更新事件:有啥方法可以将之前/之后的属性值传递给工作流?的主要内容,如果未能解决你的问题,请参考以下文章
无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?
微信小程序-wxml标签绑定data值传参给js方法(事件传参)
在 Adobe 和浏览器都将结束 Adobe Flash 之后,有啥方法可以运行 Web 应用程序
当一个对象被当作参数传递到一个方法后,此方法可改变 这个对象的属性,并可返回变化后的结果,那么这里到底是值传 递还是引用传递?
当一个对象被当作参数传递到一个方法后,此方法可改变 这个对象的属性,并可返回变化后的结果,那么这里到底是值传 递还是引用传递?