SSM集成activiti6.0错误集锦(一)
项目环境
- Maven构建
- 数据库:Orcle12c
- 服务器:Tomcat9
- <java.version>1.8</java.version>
- <activiti.version>6.0.0</activiti.version>
- <springframework.version>5.0.4.RELEASE</springframework.version>
- <mybatis.version>3.4.5</mybatis.version>
问题
问题一:java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException
- 出现原因:Jackson和Spring版本不兼容问题,activiti6中自带的Jackson版本是2.7.5,和spring5不兼容,Jackson版本过低
- 解决思路:查询pom中是否存在jacksonjar包引用,如果存在则在pom的activiti引用中排除jackson的jar包引用
- 解决步骤
- 查看pom引用jar,如下图所示,点击4——>使用3搜索,可以看见activiti-engine下依赖很多jackson的低版本的jar。2.7.5版本和Spring5一定不兼容
图一
-
- 在pom的activiti-engine下排除关于jackson的引用,如下
<!-- activiti-engine--> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency>
如果找不到相关的<groupId>和<artifactId>,可以双击图一中的标记2(也就是相关的依赖jar),将会进入到如下界面,找到相关的<groupId>和<artifactId>
- 重新引入高版本Jackson
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.5</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> </dependency>
- 强制更新maven项目,解决问题
- 在pom的activiti-engine下排除关于jackson的引用,如下
问题二:Could not open ServletContext resource [diagrams/test.bpmn]
- 出现原因:在项目启动时自送部署流程的相关配置路径问题,如下图
- 解决办法:在路径前面加上classpath: ,代表在当前资源文件路径下查找
- 如下图,修改自动部署流程路径
问题三:No qualifying bean of type 'org.activiti.engine.ProcessEngine' is defined
- 问题场景
- 我的activiti.cfg.xml中配置如下
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <!-- 配置数据源,和系统使用同一个数据源--> <property name="dataSource" ref="dataSource" /> <property name="databaseSchemaUpdate" value="true" /> <!-- 统一的事务管理 --> <property name="transactionManager" ref="transactionManager" /> <property name="activityFontName" value="宋体" /> <property name="labelFontName" value="宋体" /> <property name="deploymentResources"> <list> <value>classpath:diagrams/test.bpmn</value> </list> </property> <property name="beans"> <map> <entry key="myService" value-ref="myService" /> </map> </property> </bean> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration" /> </bean>
- Java类中注入方法如下
@Autowired @Qualifier private ProcessEngine processEngine;
- 报错信息如下图
- 我的activiti.cfg.xml中配置如下
- 问题原因
- 在配置文件中,注入的类是org.activiti.spring.ProcessEngineFactoryBean,而在Java中自动注入的实体Bean则是org.activiti.engine.ProcessEngine,两者类型不匹配
- 注解@Autowired默认是按照Bean类型来匹配,而org.activiti.engine.ProcessEngine根本就没有配置注入,所以报错
- 解决办法
- 修改匹配模式为名称匹配,将注解@Qualifier修改为@Qualifier(value="processEngine")
- 虽然两者类型不一样,但是Spring 会自动将org.activiti.spring.ProcessEngineFactoryBean强转成org.activiti.engine.ProcessEngine注入