刚接触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
相关推荐
Activiti5用户指南(中文版) 第一章、简介 ....................................................................................................................................................................
工作流管理: activiti工作流,在线配置流程,配合动态表单实现自定义流程.邮件代收: 代收指定邮箱的邮件框架功能全局restful json,前后分离.通用dao,service,controller类,增删改查直接继承即可.通用mybatis配置文件,...
Activiti5是一个业务流程管理(BPM)框架 如果我们的业务是比较复杂的话,我们才会用到工作流! 使用Activiti的步骤 定义工作流 画一个BPMN图就可以了 部署工作流 执行工作流-->按照我们...
│ 4-用户管理模块-修改功能实现7 t7 n" U% B% m- | │ 5-用户管理模块-删除功能实现 │ 6-用户管理模块-批量删除功能实现 │ ├─众筹项目-第06天《Atcrowdfunding》; L8 k& Y* v9 \- M% t! ^. q │ ├─代码 , s....
该项目样板旨在通过提供可重用的结构来管理这些自定义的整个开发生命周期,从而帮助集成商。 有了这个项目样板,集成商可以像对待任何其他源代码一样对待这些项目定制——在工作副本中进行跟踪,能够与他们的集成...
业务流程管理(BPM)和工作流系统 Activiti.zip 中国移动业务管理系统源码(SSH框架).rar 书籍管理系统.rar 企业进销存管理系统.rar 传奇私服登录器Java版附源代码.rar 修改表头加密数据库.rar 分离SQL Server数据库....
activiti工作流,在线配置流程,配合动态表单实现自定义流程. 邮件代收: 代收指定邮箱的邮件 框架功能 全局restful+json,前后分离. 通用dao,service,controller类,增删改查直接继承即可. 通用myba
activiti工作流,在线配置流程,配合动态表单实现自定义流程. 邮件代收: 代收指定邮箱的邮件 框架功能 全局restful+json,前后分离. 通用dao,service,controller类,增删改查直接继承即可. 通用mybatis配置文件,支
该项目样板旨在通过提供可重用的结构来管理这些自定义的整个开发生命周期,从而帮助集成商。 有了这个项目样板,集成商可以像对待任何其他源代码一样对待这些项目定制——在工作副本中进行跟踪,能够与他们的集成...
用户管理:用户是系统操作者,该功能主要完成系统用户配置。菜单管理:配置系统菜单,操作权限,按钮权限标识等。字典管理:对系统中经常使用的一些较为固定的数据进行维护。参数管理:对系统动态配置常用参数。快捷...
容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...
容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...
容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...
发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单...
发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单...
容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...
容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...