刚接触activiti 5 ,怎么把业务的用户和流程关联起来是个重大的问题,经过探索,得到了实现的方法。
1.spring 配置文件
<!-- Activiti begin --> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> <property name="history" value="full" /> <!-- 自动部署 --> <property name="deploymentResources"> <list> <value>classpath*:/deployments/*</value> </list> </property> <!-- 自定义表单字段类型 --> <property name="customFormTypes"> <list> <bean class="me.kafeitu.demo.activiti.activiti.form.UsersFormType" /> </list> </property> <property name="customSessionFactories"> <list> <bean class="com.sanshen.workflow.activiti.CustomUserEntityManagerFactory" /> <bean class="com.sanshen.workflow.activiti.CustomGroupEntityManagerFactory" /> </list> </property> </bean>
其中增加了customSessionFactories的配置。
2.用户管理和用户组管理工厂类实现org.activiti.engine.impl.interceptor.SessionFactory接口
public class CustomGroupEntityManagerFactory implements SessionFactory { private GroupEntityManager groupEntityManager; @Autowired public void setGroupEntityManager(GroupEntityManager groupEntityManager) { this.groupEntityManager = groupEntityManager; } public Class<?> getSessionType() { // 返回原始的GroupEntityManager类型 return GroupEntityManager.class; } public Session openSession() { // 返回自定义的GroupEntityManager实例 return groupEntityManager; } }
public class CustomUserEntityManagerFactory implements SessionFactory { private UserEntityManager userEntityManager; @Autowired public void setUserEntityManager(UserEntityManager userEntityManager) { this.userEntityManager = userEntityManager; } public Class<?> getSessionType() { // 返回原始的UserManager类型 return UserEntityManager.class; } public Session openSession() { // 返回自定义的UserManager实例 return userEntityManager; } }
3.覆盖用户管理和用户组管理的类
/** * */ package com.sanshen.workflow.activiti; import java.util.List; import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; import org.activiti.engine.impl.Page; import org.activiti.engine.impl.UserQueryImpl; import org.activiti.engine.impl.persistence.entity.IdentityInfoEntity; import org.activiti.engine.impl.persistence.entity.UserEntity; import org.activiti.engine.impl.persistence.entity.UserEntityManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; import com.sanshen.js.service.account.AccountManager; /** * 自定义的Activiti用户管理器 * * @author dragon * */ @Service public class CustomUserEntityManager extends UserEntityManager { private static final Log logger = LogFactory .getLog(CustomUserEntityManager.class); @Autowired private AccountManager accountManager; @Override public UserEntity findUserById(final String userCode) { if (userCode == null) return null; try { UserEntity userEntity = null; com.sanshen.js.entity.account.User bUser = accountManager.getUser(Long.valueOf(userCode)); userEntity = ActivitiUtils.toActivitiUser(bUser); return userEntity; } catch (EmptyResultDataAccessException e) { return null; } } @Override public List<Group> findGroupsByUser(final String userCode) { if (userCode == null) return null; List<com.sanshen.js.entity.account.Group> bGroups = accountManager.getUser(Long.valueOf(userCode)).getGroupList(); List<Group> gs = null; gs = ActivitiUtils.toActivitiGroups(bGroups); return gs; } @Override public List<User> findUserByQueryCriteria(UserQueryImpl query, Page page) { throw new RuntimeException("not implement method."); } @Override public IdentityInfoEntity findUserInfoByUserIdAndKey(String userId, String key) { throw new RuntimeException("not implement method."); } @Override public List<String> findUserInfoKeysByUserIdAndType(String userId, String type) { throw new RuntimeException("not implement method."); } @Override public long findUserCountByQueryCriteria(UserQueryImpl query) { throw new RuntimeException("not implement method."); } }
package com.sanshen.workflow.activiti; import java.util.ArrayList; import java.util.List; import org.activiti.engine.identity.Group; import org.activiti.engine.impl.GroupQueryImpl; import org.activiti.engine.impl.Page; import org.activiti.engine.impl.persistence.entity.GroupEntity; import org.activiti.engine.impl.persistence.entity.GroupEntityManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; @Service public class CustomGroupEntityManager extends GroupEntityManager { private static final Log logger = LogFactory .getLog(CustomGroupEntityManager.class); @Autowired private AccountManager accountManager; @Override public GroupEntity findGroupById(final String groupCode) { if (groupCode == null) return null; try { com.sanshen.js.entity.account.Group bGroup = accountManager.getGroupByGroupId(groupCode); GroupEntity e = new GroupEntity(); e.setRevision(1); // activiti有3种预定义的组类型:security-role、assignment、user // 如果使用Activiti // Explorer,需要security-role才能看到manage页签,需要assignment才能claim任务 e.setType("assignment"); e.setId(bGroup.getGroupId()); e.setName(bGroup.getName()); return e; } catch (EmptyResultDataAccessException e) { return null; } } @Override public List<Group> findGroupsByUser(final String userCode) { if (userCode == null) return null; List<com.sanshen.js.entity.account.Group> bGroupList = accountManager.getUser(Long.valueOf(userCode)).getGroupList(); List<Group> gs = new ArrayList<Group>(); GroupEntity g; for (com.sanshen.js.entity.account.Group bGroup : bGroupList) { g = new GroupEntity(); g.setRevision(1); g.setType("assignment"); g.setId(bGroup.getGroupId()); g.setName(bGroup.getName()); gs.add(g); } return gs; } @Override public List<Group> findGroupByQueryCriteria(GroupQueryImpl query, Page page) { throw new RuntimeException("not implement method."); } @Override public long findGroupCountByQueryCriteria(GroupQueryImpl query) { throw new RuntimeException("not implement method."); } }
其中CustomUserEntityManager和CustomGroupEntityManager有些方法没有实现,所有在使用中要防止调用到那些方法,不然会报错。
提供一个拷贝工具类
public class ActivitiUtils { public static UserEntity toActivitiUser(User bUser){ UserEntity userEntity = new UserEntity(); userEntity.setId(bUser.getId().toString()); userEntity.setFirstName(bUser.getName()); userEntity.setLastName(bUser.getLoginName()); userEntity.setPassword(bUser.getPassword()); userEntity.setEmail(bUser.getEmail()); userEntity.setRevision(1); return userEntity; } public static GroupEntity toActivitiGroup(Group bGroup){ GroupEntity groupEntity = new GroupEntity(); groupEntity.setRevision(1); groupEntity.setType("assignment"); groupEntity.setId(bGroup.getGroupId()); groupEntity.setName(bGroup.getName()); return groupEntity; } public static List<org.activiti.engine.identity.Group> toActivitiGroups(List<Group> bGroups){ List<org.activiti.engine.identity.Group> groupEntitys = new ArrayList<org.activiti.engine.identity.Group>(); for (Group bGroup : bGroups) { GroupEntity groupEntity = toActivitiGroup(bGroup); groupEntitys.add(groupEntity); } return groupEntitys; } }
这样,自身的用户就可以充当activiti的用户了
修改后,activiti的相关ACT_ID_XXX表就可以删除了。
参考
http://rongjih.blog.163.com/blog/static/335744612012631112640968/
http://forums.activiti.org/en/viewtopic.php?f=6&t=2439&hilit=UserManager
http://www.kafeitu.me/activiti/2012/04/23/synchronize-or-redesign-user-and-role-for-activiti.html
相关推荐
5. 显示流程图:最后,将生成的自定义颜色流程图展示给用户,使他们能清楚地看到流程的当前状态。 通过以上步骤,我们可以为用户提供更加直观和易于理解的流程图,提高工作效率。在实际开发中,还需要考虑性能优化...
- 自定义行为:如何编写自定义的用户任务行为、服务任务行为等,扩展Activiti的功能。 - 事件处理器:了解如何实现自定义事件处理器,处理特定的业务逻辑。 12. **最佳实践与案例分析** - 实战指导:提供实际...
这里我们主要讨论阿尔法表单,因为它们更适合自定义用户界面。 要将用户输入框改造成弹出选择框,你需要遵循以下步骤: 1. **设计流程定义**:在流程定义中,你需要为用户任务指定一个表单键(formKey)。这个键...
Spring-Activiti是Spring社区对Activiti工作流引擎的一个集成和封装,它将 Activiti 的强大功能与 Spring 框架的易用性相结合,使得在Java环境中部署和管理工作流变得简单。Activiti 提供了一套完整的流程定义语言...
5. **任务管理**:讲解 Activiti 中的任务概念,包括任务分配、完成任务、任务查询等功能,以及如何使用 TaskService API 进行任务操作。 6. **表单与数据**:介绍如何集成表单以收集和展示流程中的数据,以及如何...
5. **事件与监听器**:Activiti 提供了事件机制,如任务完成、流程实例启动或结束等,可以定义监听器来响应这些事件,实现自定义的行为。 6. **表单与字段绑定**:Activiti 集成了表单引擎,允许用户自定义表单并与...
综上所述,Activiti 5.13 用户手册将详细介绍这些概念和使用方法,帮助开发者和业务分析师充分利用 Activiti 实现高效、灵活的业务流程管理。通过深入学习和实践,您可以更好地理解和应用这一强大的工作流引擎。
Activiti Explorer则是一个Web应用程序,可以管理流程实例和报表,并且支持数据库的修改。 Activiti Modeler是一个流程模型编辑器,它允许开发者导入、编辑和报告流程模型。最后,REST API部分涵盖了如何通过通用的...
11. **安全性与权限**:手册也会涉及Activiti的安全机制,如用户、组、角色的管理,以及如何设置权限和访问控制。 12. **最佳实践与案例研究**:最后,手册可能包含一些最佳实践建议和实际应用场景,帮助用户更好地...
你可能需要编写自定义的JavaScript代码来处理表单提交,确保用户在中文编辑器中输入的内容能正确地传递给Activiti引擎。 在`activiti将用户输入框修改为弹出选择框.zip`这个压缩包中,可能包含了上述修改的源代码和...
Activiti 5.4 采用了 Apache 2.0 许可,这意味着它是免费且开源的,用户可以自由地使用、修改和分发源代码,为企业提供了灵活的使用选择。 2. **下载与获取** 用户可以通过官方网站或者其他开源软件仓库下载 ...
通过自定义接口,它可以适应各种用户管理和身份验证系统,而选择式的参与者输入则使得流程设计更为直观和高效。对于需要频繁调整或有大量用户的Activiti流程,这是一个非常实用的增强工具。为了使用这个扩展,只需要...
这部分将介绍如何通过Activiti Explorer进行流程图的展示、流程实例的管理和报表的修改。 ### 13. Activiti Modeler Activiti Modeler是一个基于浏览器的流程模型编辑工具,允许用户导入、报告数据、编辑模型并将其...
总之,"Activiti5.4 用户指南(中文版)"是一个全面的学习资源,它涵盖了从入门到进阶的各个层面,无论你是Java开发者还是流程管理新手,都能从中受益匪浅。通过阅读并实践这份指南,你将能够熟练掌握 Activiti 5.4...
### Activiti 5.16 流程管理中文版知识点概览 #### 1. 简介 - **协议**:Activiti采用Apache License 2.0协议。 - **下载**:可以从官方网站或第三方镜像站点下载Activiti 5.16版本。 - **源码**:GitHub上提供了...
5. **流程实例调试**:对于开发和测试阶段,Activiti 还提供了流程实例的调试功能,允许开发者暂停流程执行,检查当前状态,并进行必要的修改。这在优化和调试复杂流程时非常有用,视频可能会演示这一过程。 6. **...
在这个用户手册中,你可以深入理解Activiti的核心概念、功能以及如何有效地使用它来设计和管理业务流程。 1. **核心概念**: - **流程定义(Process Definition)**:这是业务流程的蓝图,用BPMN 2.0语言编写,...
### Activiti 5.13 中文用户手册关键知识点概览 #### 一、环境配置与依赖 **标题概述:** Activiti 5.13 中文用户手册提供了详细的环境配置指南。 **描述详情:** 为了确保Activiti 5.13能够正常运行,手册推荐...
"Activiti V5.21 用户手册 中文版"是专门为V5.21版本编写的,详尽介绍了如何安装、配置、开发和管理Activiti系统,包括实例教程、API参考和常见问题解答,是学习和使用Activiti的重要参考资料。 7. **升级与兼容性...