刚接触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