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