http://www.javashuo.com/article/p-nbnjsxyg-kz.htmljava
此文目的:
對網絡上的關於對activiti 使用作一個總結,由於很難找到一個很是完整的代碼結構。之後你們不用再東拼西湊。
本文是重寫activiti的 用戶部分,使用自定義管理器,也就是說再也不使用act_id_*的數據庫表。
一共建立或者修改6個文件。
1.CustomUserEntityManagerFactory.java
這是須要建立的第一個文件,是自定義的User的管理工廠類。
@Service
public class CustomUserEntityManagerFactory implements SessionFactory{
// 使用自定義的User管理類
@Resource
private CustomUserEntityManager customUserEntityManager;
@Override
public Class<?> getSessionType() {
//注意此處也必須爲Activiti原生類
return UserIdentityManager.class;
}
@Override
public Session openSession() {
return customUserEntityManager;
}
@Autowired
public void setCustomUserEntityManager(CustomUserEntityManager customUserEntityManager) {
this.customUserEntityManager = customUserEntityManager;
}
}
2.CustomGroupEntityManagerFactory.java
這是自定義Group管理工廠,也就是咱們權限中的角色類的管理了。
@Service
public class CustomGroupEntityManagerFactory implements SessionFactory{
@Resource
private CustomGroupEntityManager customGroupEntityManager;
public Class<?> getSessionType() {
// 返回原始的GroupManager類型
return GroupEntityManager.class;
}
public Session openSession() {
// 返回自定義的GroupManager實例
return customGroupEntityManager;
}
@Autowired
public void setCustomGroupEntityManager(CustomGroupEntityManager customGroupEntityManager) {
this.customGroupEntityManager = customGroupEntityManager;
}
}
3.CustomUserEntityManager.java
這是自定義用戶管理類,管理用戶方法。這裏僅僅列舉了兩個方法,實際需求再去添加,具體方法進入UserEntityManager中查看。
@Component
public class CustomUserEntityManager extends UserEntityManager{
private static final Log logger = LogFactory.getLog(CustomUserEntityManager.class);
@Autowired
private UserMapper userMapper;
@Override
public UserEntity findUserById(String userId) {
UserEntity userEntity = new UserEntity();
com.mlf.activiti.entity.User cue = userMapper.getUserByUserName(userId);//這是咱們的dao方法查詢回來的方法,是本身定義的user
userEntity = ActivitiUserUtils.toActivitiUser(cue);//將自定義的user轉化爲activiti的類
return userEntity;//返回的是activiti的實體類
}
@Override
public List<Group> findGroupsByUser(final String userCode) {
if (userCode == null)
return null;
List<Role> groupIds = userMapper.getGroupIdsByUserName(userCode);
List<Group> gs = null;
gs = ActivitiUserUtils.toActivitiGroups(groupIds);
return gs;
}
}
4.CustomGroupEntityManager .java
自定義組(角色)管理,具體方法進入GroupEntityManager中查看。
@Component
public class CustomGroupEntityManager extends GroupEntityManager{
private static final Log logger = LogFactory.getLog(CustomGroupEntityManager.class);
@Autowired
private UserMapper userMapper;//用於查詢實際業務中用戶表、角色等表
@Override
public List<Group> findGroupsByUser(final String userCode) {
if (userCode == null)
return null;
List<Role> bGroupList = userMapper.getGroupByUserName(userCode);
List<Group> gs = new java.util.ArrayList<>();
GroupEntity g;
String roleId;
String activitRole;
for (Role bGroup : bGroupList) {
g = new GroupEntity();
g.setRevision(1);
g.setType("assignment");
roleId = String.valueOf(bGroup.getId());
// activitRole = bindGroupWithRole.get(roleId);//此處只是根據RoleId獲取RoleCode, 因實際表中無RoleCode字段,暫且如此實際,此行可註釋掉
g.setId(/*activitRole != null ? activitRole :*/ roleId);
g.setName(bGroup.getName());
gs.add(g);
}
return gs;
}
}
5.ActivitiUserUtils .java
這個工具類用來將業務中本身定義的用戶轉化爲activiti中使用的user。
public class ActivitiUserUtils {
public static UserEntity toActivitiUser(User bUser){
UserEntity userEntity = new UserEntity();
userEntity.setId(bUser.getName());
userEntity.setFirstName(bUser.getUsername());
userEntity.setLastName(bUser.getName());
userEntity.setPassword(bUser.getPassword());
userEntity.setEmail(bUser.getEmail());
userEntity.setRevision(1);
return userEntity;
}
public static GroupEntity toActivitiGroup(Role sysRole){
GroupEntity groupEntity = new GroupEntity();
groupEntity.setRevision(1);
groupEntity.setType("assignment");
groupEntity.setId(sysRole.getId());
groupEntity.setName(sysRole.getName());
return groupEntity;
}
public static List<Group> toActivitiGroups(List<Role> sysRoles){
List<Group> groups = new ArrayList<Group>();
for (Role sysRole : sysRoles) {
GroupEntity groupEntity = toActivitiGroup(sysRole);
groups.add(groupEntity);
}
return groups;
}
}
6.spring-activiti.xml
這裏指定定義以上的bean對象的生成,用來依賴注入。
<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="customSessionFactories">
<list>
<bean class="com.mlf.activiti.custom.CustomUserEntityManagerFactory" >
<property name="customUserEntityManager" ref="customUserEntityManager"/>
</bean>
<bean class="com.mlf.activiti.custom.CustomGroupEntityManagerFactory" >
<property name="customGroupEntityManager" ref="customGroupEntityManager"/>
</bean>
</list>
</property>
</bean>
<bean id="customUserEntityManager" class="com.mlf.activiti.custom.manager.CustomUserEntityManager"/>
<bean id="customGroupEntityManager" class="com.mlf.activiti.custom.manager.CustomGroupEntityManager"/>
7.這樣基本的配置全都結束了,哪裏還有不足呢,好比說,3,4,5,中Role.java須要寫,這個就是一個user類換了個名字嘛,很簡單;另外一個是咱們基本都是用mybatis的,在3,4,中使用的mapper就是咱們須要本身編碼的dao層接口,和對應的mapper文件。這裏就很少敘述了。
在之後使用用戶,或者角色,就經過咱們定義的管理器來控制。
注意,有的方法咱們沒有實現,若是調用的話,一旦訪問act_id_*的數據,會出現咱們不想要的數據。
下面兩篇文章能夠幫助深刻理解,不過具體實例仍是看個人上述代碼,比較好。
若有錯誤,歡迎指出,評論,一塊兒探討。歡迎各位一塊兒交流,個人郵箱公開。
推薦文章:淺談Activiti工做流引擎用戶管理
推薦文章:《同步或者重構Activiti Identify用戶數據的多種方案比較》spring