Настройте Activiti для повторного использования существующих данных пользователя / группы в Spring Boot

Я использую Spring Boot 1.4.3.RELEASE. Я уже создал простое приложение MVC для управления пользователями и группами. Теперь я пытаюсь интегрировать Activiti 5.21.0 в свой проект и ПОВТОРНО ИСПОЛЬЗОВАТЬ существующие таблицы пользователей / групп с помощью Activiti.

Я расширил стандартные классы UserEntityManager и GroupEntityManager от Activiti, как показано ниже:

CustomUserEntityManager.java

import java.util.List;

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 com.example.spring.dao.UserDao;
import com.example.spring.model.User;

public class CustomUserEntityManager extends UserEntityManager {

    private UserDao userDao;

    public CustomUserEntityManager(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public UserEntity findUserById(String userId) {
        User user = userDao.findById(Integer.parseInt(userId));
        return userToActivitiUser(user);
    }

    @Override
    public org.activiti.engine.identity.User createNewUser(String userId) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void insertUser(org.activiti.engine.identity.User user) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void updateUser(org.activiti.engine.identity.User updatedUser) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void deleteUser(String userId) {
        throw new UnsupportedOperationException();
    }

    @Override
    public List<org.activiti.engine.identity.User> findUserByQueryCriteria(UserQueryImpl query, Page page) {
        throw new UnsupportedOperationException();
    }

    @Override
    public long findUserCountByQueryCriteria(UserQueryImpl query) {
        throw new UnsupportedOperationException();
    }

    @Override
    public IdentityInfoEntity findUserInfoByUserIdAndKey(String userId, String key) {
        throw new UnsupportedOperationException();
    }

    @Override
    public List<String> findUserInfoKeysByUserIdAndType(String userId, String type) {
        throw new UnsupportedOperationException();
    }

    private UserEntity userToActivitiUser(User user) {
        UserEntity activitiUser = new UserEntity();
        activitiUser.setId(user.getId().toString());
        activitiUser.setPassword(user.getPassword());
        activitiUser.setFirstName(user.getUsername());
        activitiUser.setLastName(user.getLastName());
        activitiUser.setEmail(user.getEmail());
        return activitiUser;
    }

}

ActivitiGroupEntityManager.java

import java.util.List;

import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.GroupQuery;
import org.activiti.engine.impl.GroupQueryImpl;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.persistence.entity.GroupEntityManager;

import com.example.spring.dao.CMSGroupDao;

public class CustomGroupEntityManager extends GroupEntityManager {

    private CMSGroupDao groupDao;

    public CustomGroupEntityManager(CMSGroupDao groupDao) {
        this.groupDao = groupDao;
    }

    @Override
    public List<Group> findGroupsByUser(String userId) {
        // TODO add logic
        return null;
    }

    @Override
    public Group createNewGroup(String groupId) {
            throw new UnsupportedOperationException();
    }

    @Override
    public void deleteGroup(String groupId) {
            throw new UnsupportedOperationException();
    }

    @Override
    public GroupQuery createNewGroupQuery() {
            return super.createNewGroupQuery();
    }

    @Override
    public List<Group> findGroupByQueryCriteria(GroupQueryImpl query, Page page) {
            throw new UnsupportedOperationException();
    }

    @Override
    public long findGroupCountByQueryCriteria(GroupQueryImpl query) {
            throw new UnsupportedOperationException();
    }

}

затем я добавил свои собственные фабрики, как показано ниже:

CustomUserManagerFactory.java

import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.example.spring.dao.UserDao;

@Component(value = "customUserManagerFactory")
public class CustomUserManagerFactory implements SessionFactory {

    @Autowired
    private UserDao userDao;

    @Override
    public Class<?> getSessionType() {
        return CustomUserEntityManager.class;
    }

    @Override
    public Session openSession() {
        return new CustomUserEntityManager(userDao);
    }

}

CustomGroupManagerFactory.java

import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.example.spring.dao.CMSGroupDao;

@Component(value = "customGroupManagerFactory")
public class CustomGroupManagerFactory implements SessionFactory {

    @Autowired
    private CMSGroupDao groupDao;

    @Override
    public Class<?> getSessionType() {
        return CustomGroupEntityManager.class;
    }

    @Override
    public Session openSession() {
        return new CustomGroupEntityManager(groupDao);
    }

}

Наконец, я добавил свой компонент конфигурации ProcessEngine, как показано ниже:

ProcessEngineConfig.java

package com.example.spring.configuration;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.activiti.engine.impl.interceptor.SessionFactory;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Configuration;

@Configuration
@AutoConfigureBefore(org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class)
public class ProcessEngineConfig implements ProcessEngineConfigurationConfigurer{

    @Resource(name = "customUserManagerFactory")
    private SessionFactory userManagerFactory;

    @Resource(name = "customGroupManagerFactory")
    private SessionFactory groupManagerFactory;

    public void configure(SpringProcessEngineConfiguration pec) {
        pec.setDbIdentityUsed(false); 
        List<SessionFactory> customSessionFactories = new ArrayList<SessionFactory>();
        customSessionFactories.add(userManagerFactory);
        customSessionFactories.add(groupManagerFactory);
        if (pec.getCustomSessionFactories() == null){
            pec.setCustomSessionFactories(customSessionFactories);
        }
        else{
            pec.getCustomSessionFactories().addAll(customSessionFactories);
        }
    }
}

Важные части из pom.xml

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <activiti.version>5.21.0</activiti.version>
    </properties>

    <dependencies>

        <!-- Activiti Dependencies -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-actuator</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <!-- Spring-boot Dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        .......
        .......
     </dependencies>

Приложение выполняется без каких-либо ошибок времени выполнения, ОДНАКО, когда я создаю пользователя с помощью org.activiti.engine.IdentityService.newUser(), пользователь создается и сохраняется в таблице пользователей Activit, а UnsupportedOperationException() не выбрасывается, что означает, что пользовательская конфигурация не работает.

Любая помощь будет оценена по достоинству!


person Andromida    schedule 12.01.2017    source источник
comment
Привет, @Andromida, я работаю над чем-то похожим, и я немного потерялся, так как я новичок в весенней загрузке и активити. Не могли бы вы предоставить ссылку на github или что-то в этом роде, чтобы мы могли узнать, как все это работает? Спасибо.   -  person Kshitij Bajracharya    schedule 03.12.2018
comment
Привет @Andromida. У меня есть аналогичный вариант использования, и я буду признателен, если вы поделитесь с нами образцом кода.   -  person Gautam    schedule 28.05.2019
comment
Привет @Gautam, все, что вам нужно, описано в вопросе, просто согласитесь с обновленным ответом.   -  person Andromida    schedule 14.06.2019


Ответы (1)


Для CustomGroupManagerFactory тип должен быть:

  @Override
  public Class<?> getSessionType() {
      return GroupIdentityManager.class;
  }

Для CustomUserManagerFactory тип должен быть:

  @Override
  public Class<?> getSessionType() {
      return UserIdentityManager.class;
  }

Я надеюсь, что приведенное выше решение поможет вам заставить его работать.

person ahmed mahfouz    schedule 12.01.2017
comment
Привет, Ахмед, На самом деле, только исправление типа в пользовательских фабриках решило проблему. +1 за подсказку и, пожалуйста, отредактируйте ответ и сохраните первые два шага только для того, чтобы принять его - person Andromida; 13.01.2017
comment
Привет, Андромида! Рад слышать, что проблема решена. Я отредактировал свой ответ и спасибо. - person ahmed mahfouz; 13.01.2017