<parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.13.RELEASE</version>
        </parent>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

 Activiti7中是没有这个红色框中的类的

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deploymentController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deploymentServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.activiti.spring.boot.ProcessEngineAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userGroupManager' defined in class path resource [org/activiti/core/common/spring/identity/config/ActivitiSpringIdentityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'userGroupManager' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.core.userdetails.UserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
启动会报出上面的异常这个异常的意思是 Spring 容器中至少有一个org.springframework.security.core.userdetails.UserDetailsService实例,原因是Activiti7默认自动整合Spring-Security,尤其是当你要使用Activiti7提供的新的Api

 

 这就是新Api中的两个,其他的也一样默认会从SpringSecurity的上下文中获取当前请求用户的信息,然后校验新Api类上的

@PreAuthorize("hasRole('ACTIVITI_ADMIN')")中的所需权限

我的项目中不需要使用SpringSecutiry所以我只能选择使用旧的Api进行开发

为了项目能顺利启动我还是在项目中添加了,应为SpringSecurity需要它

/**
 * @author fjl
 */
@Slf4j
@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return null;
    }
}

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deploymentController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deploymentServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'deploymentResourceMapper' defined in file [D:\IdeaProjects\dms-workflow\target\classes\com\dms\workflow\mapper\DeploymentResourceMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.getLanguageDriver(Ljava/lang/Class;)Lorg/apache/ibatis/scripting/LanguageDriver;
这里有报错了 这里的意思是运行时调用方法失败 找不到对应的方法 ,根据经验编译时没问题,运行时报错 java.lang.NoSuchMethodError 一般都是jar冲突,反正我以前遇到这种情况都是这样解决了。

根据报错中提示的信息可以知道冲突的类在 Mybatis 的jar包中,

在idea的命令行中执行 mvn dependency:tree

[INFO] +- com.baomidou:mybatis-plus-boot-starter:jar:3.4.2:compile
[INFO] |  +- com.baomidou:mybatis-plus:jar:3.4.2:compile
[INFO] |  |  \- com.baomidou:mybatis-plus-extension:jar:3.4.2:compile
[INFO] |  |     +- com.baomidou:mybatis-plus-core:jar:3.4.2:compile
[INFO] |  |     |  +- com.baomidou:mybatis-plus-annotation:jar:3.4.2:compile
[INFO] |  |     |  +- com.github.jsqlparser:jsqlparser:jar:4.0:compile
[INFO] |  |     |  \- org.mybatis:mybatis:jar:3.5.6:compile
[INFO] |  |     \- org.mybatis:mybatis-spring:jar:2.0.5:compile
[INFO] |  \- org.springframework.boot:spring-boot-autoconfigure:jar:2.1.13.RELEASE:compile
+- org.activiti:activiti-spring-boot-starter:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti:activiti-spring-app-process:jar:7.1.0.M6:compile
[INFO] |  |  \- org.activiti.core.common:activiti-spring-application:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti.core.common:activiti-spring-identity:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti.core.common:activiti-spring-security:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti.api:activiti-api-process-model:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti.api:activiti-api-process-runtime:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti.api:activiti-api-model-shared:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti.api:activiti-api-runtime-shared:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti:activiti-spring:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti:activiti-bpmn-converter:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti:activiti-process-validation:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti.core.common:activiti-spring-project:jar:7.1.0.M6:compile
[INFO] |  |  +- org.springframework:spring-orm:jar:5.1.14.RELEASE:compile
[INFO] |  |  +- javax.el:el-api:jar:2.2:compile
[INFO] |  |  \- org.slf4j:jcl-over-slf4j:jar:1.7.30:compile
[INFO] |  +- org.activiti:activiti-engine:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti.core.common:activiti-project-model:jar:7.1.0.M6:compile
[INFO] |  |  +- org.apache.commons:commons-email:jar:1.5:compile
[INFO] |  |  |  \- com.sun.mail:javax.mail:jar:1.6.2:compile
[INFO] |  |  |     \- javax.activation:activation:jar:1.1:compile
[INFO] |  |  +- org.mybatis:mybatis:jar:3.5.0:compile
[INFO] |  |  +- de.odysseus.juel:juel-api:jar:2.2.7:compile
[INFO] |  |  +- de.odysseus.juel:juel-impl:jar:2.2.7:compile
[INFO] |  |  +- de.odysseus.juel:juel-spi:jar:2.2.7:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-core:jar:2.9.10:compile
[INFO] |  |  \- joda-time:joda-time:jar:2.10.5:compile
[INFO] |  +- org.activiti:activiti-bpmn-model:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti:activiti-api-process-runtime-impl:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti.core.common:activiti-connector-model:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti.core.common:activiti-spring-connector:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti:activiti-api-model-shared-impl:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti:activiti-api-runtime-shared-impl:jar:7.1.0.M6:compile
[INFO] |  |  \- org.activiti.core.common:activiti-spring-security-policies:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti:activiti-api-task-runtime-impl:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti.api:activiti-api-task-model:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti.api:activiti-api-task-runtime:jar:7.1.0.M6:compile
[INFO] |  |  +- org.activiti:activiti-api-task-model-impl:jar:7.1.0.M6:compile
[INFO] |  |  \- org.activiti.core.common:activiti-common-util:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti:activiti-api-process-model-impl:jar:7.1.0.M6:compile
[INFO] |  +- org.activiti:activiti-spring-process-extensions:jar:7.1.0.M6:compile
[INFO] |  |  \- org.activiti:activiti-spring-resource-loader:jar:7.1.0.M6:compile
[INFO] |  |     \- org.activiti.core.common:activiti-spring-resource-finder:jar:7.1.0.M6:compile

 这里可以看到  在 mytatis-plus和 org.activiti:activiti-spring-boot-starter:jar:7.1.0.M6

的依赖中都有mybatis而且版本不一样 , 先试一下将activiti中的排除

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>7.1.0.M6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

这时可以顺利启动了,常用的Api也可以顺利调用了,但是知道我用到两个方法的时候又出现问题了,这个问题我只是怀疑是SpringSecurity的原因但是还没有证实,也没有解决掉。

    @Test
    public void taskQuery(){

        // https://www.imooc.com/wenda/detail/394339
        TaskQuery taskQuery = taskService.createTaskQuery().active().taskCandidateUser("24243");

        List<Task> list = taskQuery.list();
        list.forEach(task -> {
            System.out.println("assignee:"+task.getAssignee());
            System.out.println("taskName:"+task.getName());
            System.out.println("taskId:"+task.getId());
            System.out.println("processInstanceId:"+task.getProcessInstanceId());
            System.out.println("processDefinitionId:"+task.getProcessDefinitionId());
        });
    }

这里注意 我的 taskService中通过 Spring注入了 结果报了一下的错误

 

    @Test
    public void taskQuery(){

        // https://www.imooc.com/wenda/detail/394339
        TaskQuery taskQuery = taskService.createTaskQuery().active().taskCandidateOrAssigned("24243");

        List<Task> list = taskQuery.list();
        list.forEach(task -> {
            System.out.println("assignee:"+task.getAssignee());
            System.out.println("taskName:"+task.getName());
            System.out.println("taskId:"+task.getId());
            System.out.println("processInstanceId:"+task.getProcessInstanceId());
            System.out.println("processDefinitionId:"+task.getProcessDefinitionId());
        });
    }
taskCandidateUser()  taskCandidateOrAssigned()

以上两个方法都会报错:

### Error querying database.  Cause: java.lang.NullPointerException
### Cause: java.lang.NullPointerException
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
    at org.activiti.engine.impl.db.DbSqlSession.selectListWithRawParameter(DbSqlSession.java:404)
    at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:374)
    at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:365)
    at org.activiti.engine.impl.persistence.entity.data.impl.MybatisTaskDataManager.findTasksByQueryCriteria(MybatisTaskDataManager.java:66)
    at org.activiti.engine.impl.persistence.entity.TaskEntityManagerImpl.findTasksByQueryCriteria(TaskEntityManagerImpl.java:260)
    at org.activiti.engine.impl.TaskQueryImpl.executeList(TaskQueryImpl.java:1357)
    at org.activiti.engine.impl.AbstractQuery.execute(AbstractQuery.java:163)
    at org.activiti.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:37)
    at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:78)
    at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:57)
    at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:42)
    at org.activiti.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:48)

这个问题我解决了 一天解决不了  

但是一下代码是可以顺利执行的

    @Test
    public void taskQuery(){

        ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg1.xml");
        ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        TaskQuery taskQuery = taskService.createTaskQuery().active().taskAssignee("张三").taskCandidateUser("evection-process");
        List<Task> list = taskQuery.list();
        list.forEach(task -> {
            System.out.println("assignee:"+task.getAssignee());
            System.out.println("taskName:"+task.getName());
            System.out.println("taskId:"+task.getId());
            System.out.println("processInstanceId:"+task.getProcessInstanceId());
            System.out.println("processDefinitionId:"+task.getProcessDefinitionId());
        });
    }

同样的方法这里可以顺利调用成功,唯一的区别就是这里没有从Spring容器中获取taskService对象,而是自己通过编码的方式获取的taskService。

说明Activiti7是支持该方法的,但是和SpringBoot整合之后就有问题了,本人能力不行解决不了

我选择了放弃 Activiti7 使用 Activiti6

        
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.13.RELEASE</version>
        </parent>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>6.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

由于activiti6没有自动整合SpringSecurity 也没有相关的依赖,以下的类会报错,直接删掉

/**
 * @author fjl
 */
@Slf4j
@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return null;
    }
}

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deploymentController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deploymentServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'deploymentResourceMapper' defined in file [D:\IdeaProjects\dms-workflow\target\classes\com\dms\workflow\mapper\DeploymentResourceMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.getLanguageDriver(Ljava/lang/Class;)Lorg/apache/ibatis/scripting/LanguageDriver;
又是jar包冲突 这里直接排除activiti6中的mybatis

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>6.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
这个问题从网上找到解决方法 博客是 

SpringBoot2+mybatisPlus3+activiti6整合,踩的坑_weixin_zhang141406的博客-CSDN博客

 这需要把这两个类都排除掉

到此 activiti6 顺利启动,如果有道友解决了我上面没解决的问题 可以在评论区告知一下 一起进步

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐