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
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中的排除
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博客
这需要把这两个类都排除掉
到此 activiti6 顺利启动,如果有道友解决了我上面没解决的问题 可以在评论区告知一下 一起进步