SSM集成activiti6.0错误集锦(一)

时间:2023-03-08 21:08:35

项目环境

  • 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一定不兼容

      SSM集成activiti6.0错误集锦(一)

                            图一

    • 在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>

      SSM集成activiti6.0错误集锦(一)

    • 重新引入高版本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项目,解决问题

问题二:Could not open ServletContext resource [diagrams/test.bpmn]

  • 出现原因:在项目启动时自送部署流程的相关配置路径问题,如下图

    SSM集成activiti6.0错误集锦(一)

  • 解决办法:在路径前面加上classpath:  ,代表在当前资源文件路径下查找
    • 如下图,修改自动部署流程路径

      SSM集成activiti6.0错误集锦(一)

问题三: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;
    • 报错信息如下图

      SSM集成activiti6.0错误集锦(一)

  • 问题原因
    • 在配置文件中,注入的类是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注入

相关文章