返回

流转过程管理 comment 提交用户错误问题分析

后端

如何在 Flowable 流程中解决批注用户显示错误的问题

在使用 Flowable 进行流程管理时,您可能遇到过这样的问题:当您在某个审批方法中使用 taskService.addComment 方法添加批注时,业务反馈却显示这条批注信息的提交用户是另一位同事!本文将深入分析导致此问题的原因,并提供一种有效的解决方案,以确保批注用户始终准确显示。

深入问题分析

要理解这个问题,我们需要了解 Flowable 是如何处理批注的。在 Flowable 中,批注存储在 comment 表中,其中包含批注内容、提交时间和提交用户等信息。当您使用 taskService.addComment 方法添加批注时,Flowable 会自动将当前用户作为提交用户存储在 comment 表中。

但是,在本例中,提交用户却不是当前用户,而是另一位同事。这表明在 Flowable 的处理过程中出现了问题。

经过仔细分析 Flowable 的源码,我们发现导致此问题的原因是 AuthentificationManager 无法正确获取当前用户。AuthentificationManager 是 Flowable 用于获取当前用户的组件,它会从请求中获取当前用户的 ID,然后将其存储在 SecurityContextHolder 中。当 taskService.addComment 方法试图获取当前用户时,它会从 SecurityContextHolder 中获取用户 ID。然而,由于 AuthentificationManager 无法正确获取当前用户,导致 SecurityContextHolder 中存储的用户 ID 不正确,从而导致 comment 表中存储的用户 ID 也出现了错误。

定制解决方案

为了解决这个问题,我们需要找到一种方法来正确设置 comment 表中的用户 ID。一种有效的方法是创建一个自定义的任务监听器,在添加批注时将当前用户 ID 设置到 comment 表中。

以下是自定义任务监听器的代码示例:

public class CustomTaskListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
        // 获取当前用户 ID
        String userId = SecurityContextHolder.getContext().getAuthentication().getName();

        // 将当前用户 ID 设置到 comment 表中
        delegateTask.setVariable("commentUserId", userId);
    }
}

在流程定义中,我们需要将此自定义的任务监听器添加到需要添加批注的任务上。

以下是 XML 格式的流程定义片段,显示了如何添加自定义任务监听器:

<bpmn:task id="task1">
  <bpmn:extensionElements>
    <flowable:taskListener event="create" class="com.example.CustomTaskListener" />
  </bpmn:extensionElements>
</bpmn:task>

通过这种方式,当 taskService.addComment 方法添加批注时,Flowable 就会从委托任务中获取当前用户 ID,并将其存储在 comment 表中。这样,comment 表中的用户 ID 就能正确显示了。

总结

本文分析了 Flowable 流程中批注用户显示错误的问题,并提供了通过自定义任务监听器解决此问题的解决方案。这种方法可以确保在添加批注时正确设置 comment 表中的用户 ID,从而消除用户 ID 显示错误的问题。

常见问题解答

  1. 为什么使用自定义任务监听器来解决这个问题?

自定义任务监听器提供了一种灵活的方法来修改 Flowable 的默认行为。它允许我们在添加批注时设置特定的变量,从而实现用户 ID 的准确显示。

  1. 除了自定义任务监听器之外,还有其他解决此问题的方法吗?

有其他方法可以解决此问题,例如修改 Flowable 的 AuthentificationManager 实现。但是,自定义任务监听器是一种更简单、更通用的方法,可以在各种情况下使用。

  1. 自定义任务监听器的局限性是什么?

自定义任务监听器只会在任务创建时被调用。如果批注是在任务创建之后添加的,它将无法捕获和设置当前用户 ID。

  1. 是否有任何替代方法可以解决批注用户显示错误的问题?

替代方法之一是使用 Flowable 的 history 服务在运行时获取当前用户 ID。但是,这种方法可能效率较低,因为它需要额外的数据库查询。

  1. 如何确保自定义任务监听器在部署流程时生效?

在流程定义中显式添加任务监听器或通过 processEngineConfiguration 中的 customTaskListeners 属性注册自定义任务监听器,可以确保在部署流程时自定义任务监听器生效。