Springboot2 整合 Activiti7和mybatis-plus3失败以及踩到的坑

        
            org.springframework.boot
            spring-boot-starter-parent
            2.1.13.RELEASE
        

        
            org.activiti
            activiti-spring-boot-starter
            7.1.0.M6
        

        
            com.baomidou
            mybatis-plus-boot-starter
            3.4.2
        

Springboot2 整合 Activiti7和mybatis-plus3失败以及踩到的坑_第1张图片

 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

Springboot2 整合 Activiti7和mybatis-plus3失败以及踩到的坑_第2张图片

Springboot2 整合 Activiti7和mybatis-plus3失败以及踩到的坑_第3张图片

 

 这就是新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中的排除

        
            org.activiti
            activiti-spring-boot-starter
            7.1.0.M6
            
                
                    org.mybatis
                    mybatis
                
            
        

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

    @Test
    public void taskQuery(){

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

        List 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 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 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

        
        
            org.springframework.boot
            spring-boot-starter-parent
            2.1.13.RELEASE
        

        
            org.activiti
            activiti-spring-boot-starter-basic
            6.0.0
        

        
            com.baomidou
            mybatis-plus-boot-starter
            ${mybatis-plus.version}
        

由于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

        
            org.activiti
            activiti-spring-boot-starter-basic
            6.0.0
            
                
                    org.mybatis
                    mybatis
                
            
        

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博客

Springboot2 整合 Activiti7和mybatis-plus3失败以及踩到的坑_第4张图片

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

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

你可能感兴趣的:(java,activiti,spring,boot,mybatis)