第6篇:Flowable-Modeler详述之常见问题Table act_ge_property doesn't exist

接上一篇:
第5篇: Flowable-Modeler详述之开发环境搭建
https://blog.csdn.net/weixin_40816738/article/details/102887854

文章目录

    • 1. 问题描述
    • 2. 问题定位
    • 解决方案一
    • 解决方案二(推荐)

1. 问题描述

在配置完Springboot的开发环境以后,启动的时候遇到了这个问题,数据库版本为mysql 5.7,Flowable版本为6.4.0,详细报错如下:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'flowController': Unsatisfied dependency expressed through field 'flowService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'flowServiceImpl': Unsatisfied dependency expressed through field 'repositoryService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'repositoryServiceBean' defined in class path resource [org/flowable/spring/boot/ProcessEngineServicesAutoConfiguration.class]: Unsatisfied dependency expressed through method 'repositoryServiceBean' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'processEngine' defined in class path resource [org/flowable/spring/boot/ProcessEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'processEngine' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flowableAppEngine': FactoryBean threw exception on object creation; nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'flowstudy.act_ge_property' doesn't exist
### The error may exist in org/flowable/db/mapping/entity/Property.xml
### The error may involve org.flowable.engine.impl.persistence.entity.PropertyEntityImpl.selectProperty-Inline
### The error occurred while setting parameters
### SQL: select * from ACT_GE_PROPERTY where NAME_ = ?
### Cause: java.sql.SQLSyntaxErrorException: Table 'flowstudy.act_ge_property' doesn't existat org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:586) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1341) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:572) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780) [spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) [spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:333) [spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1277) [spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1265) [spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]at com.hyj.main.App.main(App.java:22) [classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.0.5.RELEASE.jar:2.0.5.RELEASE]

2. 问题定位

看提示显示表不存在说明数据库中没有该表,此时查看的确没有,但是Flowable启动的时候应该会自动创建表的,说明表创建的逻辑判断发生问题
查看代码发现判断主要函数为:

isEngineTablePresent

代码位于类 ProcessDbSchemaManager中,核心判断存在如下:

 public void schemaCreate() {this.getCommonSchemaManager().schemaCreate();this.getIdentityLinkSchemaManager().schemaCreate();this.getTaskSchemaManager().schemaCreate();this.getVariableSchemaManager().schemaCreate();this.getJobSchemaManager().schemaCreate();//使用这个函数判断是否要创建引擎if (this.isEngineTablePresent()) {String dbVersion = this.getDbVersion();if (!"6.4.0.0".equals(dbVersion)) {throw new FlowableWrongDbException("6.4.0.0", dbVersion);}} else {this.dbSchemaCreateEngine();}if (CommandContextUtil.getDbSqlSession().getDbSqlSessionFactory().isDbHistoryUsed()) {this.dbSchemaCreateHistory();}
}

更新的时候,设置databaseSchemaUpdate=true的时候,走update,可以看到如下代码也是使用isEngineTablePresent来判断是否存在

public String schemaUpdate() {PropertyEntity dbVersionProperty = null;String dbVersion = null;String feedback = null;boolean isUpgradeNeeded = false;int matchingVersionIndex = -1;int version6120Index = FlowableVersions.getFlowableVersionIndexForDbVersion("6.1.2.0");DbSqlSession dbSqlSession = CommandContextUtil.getDbSqlSession();boolean isEngineTablePresent = this.isEngineTablePresent();if (isEngineTablePresent) {dbVersionProperty = (PropertyEntity)dbSqlSession.selectById(PropertyEntityImpl.class, "schema.version");dbVersion = dbVersionProperty.getValue();matchingVersionIndex = FlowableVersions.getFlowableVersionIndexForDbVersion(dbVersion);isUpgradeNeeded = matchingVersionIndex != FlowableVersions.FLOWABLE_VERSIONS.size() - 1;}boolean isHistoryTablePresent = this.isHistoryTablePresent();if (isUpgradeNeeded && matchingVersionIndex < version6120Index) {this.dbSchemaUpgradeUntil6120("engine", matchingVersionIndex);if (isHistoryTablePresent) {this.dbSchemaUpgradeUntil6120("history", matchingVersionIndex);}}this.getCommonSchemaManager().schemaUpdate();this.getIdentityLinkSchemaManager().schemaUpdate();this.getTaskSchemaManager().schemaUpdate();this.getVariableSchemaManager().schemaUpdate();this.getJobSchemaManager().schemaUpdate();if (isUpgradeNeeded) {dbVersionProperty.setValue("6.4.0.0");PropertyEntity dbHistoryProperty;if ("5.0".equals(dbVersion)) {dbHistoryProperty = (PropertyEntity)CommandContextUtil.getPropertyEntityManager().create();dbHistoryProperty.setName("schema.history");dbHistoryProperty.setValue("create(5.0)");dbSqlSession.insert(dbHistoryProperty);} else {dbHistoryProperty = (PropertyEntity)dbSqlSession.selectById(PropertyEntity.class, "schema.history");}String dbHistoryValue = "upgrade(" + dbVersion + "->" + "6.4.0.0" + ")";dbHistoryProperty.setValue(dbHistoryValue);if (version6120Index > matchingVersionIndex) {this.dbSchemaUpgrade("engine", version6120Index);} else {this.dbSchemaUpgrade("engine", matchingVersionIndex);}feedback = "upgraded Flowable from " + dbVersion + " to " + "6.4.0.0";} else if (!isEngineTablePresent) {this.dbSchemaCreateEngine();}if (isHistoryTablePresent) {if (isUpgradeNeeded) {if (version6120Index > matchingVersionIndex) {this.dbSchemaUpgrade("history", version6120Index);} else {this.dbSchemaUpgrade("history", matchingVersionIndex);}}} else if (dbSqlSession.getDbSqlSessionFactory().isDbHistoryUsed()) {this.dbSchemaCreateHistory();}return feedback;}

isEngineTablePresent代码实现如下:
可以看到使用的是表ACT_RU_EXECUTION是否存在来判断的

    public boolean isEngineTablePresent() {return this.isTablePresent("ACT_RU_EXECUTION");}

进一步跟踪看到isTablePresent的实现如下:

 public boolean isTablePresent(String tableName) {DbSqlSession dbSqlSession = this.getDbSqlSession();DbSqlSessionFactory dbSqlSessionFactory = dbSqlSession.getDbSqlSessionFactory();if (!dbSqlSession.getDbSqlSessionFactory().isTablePrefixIsSchema()) {tableName = this.prependDatabaseTablePrefix(tableName);}Connection connection = null;try {connection = dbSqlSession.getSqlSession().getConnection();DatabaseMetaData databaseMetaData = connection.getMetaData();ResultSet tables = null;String catalog = dbSqlSession.getConnectionMetadataDefaultCatalog();if (dbSqlSessionFactory.getDatabaseCatalog() != null && dbSqlSessionFactory.getDatabaseCatalog().length() > 0) {catalog = dbSqlSessionFactory.getDatabaseCatalog();}String schema = dbSqlSession.getConnectionMetadataDefaultSchema();if (dbSqlSessionFactory.getDatabaseSchema() != null && dbSqlSessionFactory.getDatabaseSchema().length() > 0) {schema = dbSqlSessionFactory.getDatabaseSchema();} else if (dbSqlSessionFactory.isTablePrefixIsSchema() && StringUtils.isNotEmpty(dbSqlSessionFactory.getDatabaseTablePrefix())) {schema = dbSqlSessionFactory.getDatabaseTablePrefix();if (StringUtils.isNotEmpty(schema) && schema.endsWith(".")) {schema = schema.substring(0, schema.length() - 1);}}String databaseType = dbSqlSessionFactory.getDatabaseType();if ("postgres".equals(databaseType)) {tableName = tableName.toLowerCase();}if (schema != null && "oracle".equals(databaseType)) {schema = schema.toUpperCase();}if (catalog != null && catalog.length() == 0) {catalog = null;}boolean var10;try {//查询元数据中的表,根据schema和tablename查看tables = databaseMetaData.getTables(catalog, schema, tableName, JDBC_METADATA_TABLE_TYPES);var10 = tables.next();} finally {try {if (tables != null) {tables.close();}} catch (Exception var18) {LOGGER.error("Error closing meta data tables", var18);}}return var10;} catch (Exception var20) {throw new FlowableException("couldn't check if tables are already present using metadata: " + var20.getMessage(), var20);}}

我们启动程序跟踪进入,查看使用getTables读取表,如下图所示:
在这里插入图片描述
-因为机器上以前其他的mysql数据库中部署过Flowable的表,所以当schema为空的时候搜索mysql的元数据的时候搜索到了历史用的表,但是不在该数据库中,所以程序以为表已经有了,但是其实还是历史的表,到此我们基本上找到原因了。
我们使用的驱动为8.0的驱动,8.0版本驱动将参数 nullCatalogMeansCurrent 的默认值由true改为了false,如果你使用DatabaseMetaData.getTables获取所有的表信息。

解决方案一

把正常的数据库的表导出为sql,手动创建表。

解决方案二(推荐)

mysql的连接字符串中添加上nullCatalogMeansCurrent=true,将schema默认设置为当前连接的schema。

完整的数据库配置信息

# 数据源配置
spring:datasource:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/flowstudy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&&zeroDateTimeBehavior=convertToNull&useSSL=true&allowMulQueries=true&nullCatalogMeansCurrent=trueusername: rootpassword: root

下一篇:
第7篇:Flowable-Modeler集成之Flowable源码编译
https://blog.csdn.net/weixin_40816738/article/details/102899693

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务架构之「 配置中心 」

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;奎哥来源&#xff1a;不止思考 在微服务架构的系列文章中&#xff0c;前面已经通过文章《微服务架构之「服务网关 」》介绍过了在微服务中服务网关的原理和应用&#xff0c;今天这篇文章我们继续来聊一聊微服务中另…

助力APP尽情“撒币”!阿里云正式上线移动直播问答解决方案

摘要&#xff1a; 2018年伊始&#xff0c;互联网圈就刮起了一阵“大佬狂撒币&#xff0c;网友喜答题”的热潮&#xff0c;为了助力企业紧握风口&#xff0c;阿里云推出一站式移动直播问答解决方案。通过稳定高性能的计算基础设施和可扩展的直播问答系统架构&#xff0c;实现技术…

阿里云云数据库开了一个未来大会,谈了谈2038年的数据库趋势

摘要&#xff1a; “未来的某一天&#xff0c;量子数据库是我们改造其他星球的关键技术之一。” 1月17日&#xff0c;在北京举行的阿里云2018云数据库智能未来大会上&#xff0c;阿里云高级产品专家王义成如是说。 除了阿里云的全新一代NoSQL向NewSQL融合&#xff0c;NewSQL产品…

《游戏行业DDoS攻击解决方案》重磅发布

摘要&#xff1a; 游戏行业一直是竞争、攻击最为复杂的一个江湖。曾经多少充满激情的创业团队、玩法极具特色的游戏产品&#xff0c;被互联网攻击的问题扼杀在摇篮里&#xff1b;又有多少运营出色的游戏产品&#xff0c;因为遭受DDoS攻击&#xff0c;而一蹶不振。游戏行业在防御…

红帽:将开源进行到底

戳蓝字“CSDN云计算”关注我们哦&#xff01;2019年7月9日&#xff0c;IBM史上最大的一笔收购案终于尘埃落定&#xff0c;IBM以每股现金190.0美元&#xff0c;完成对红帽所有已发行和流通在外普通股的收购交易&#xff0c;总股本价值约340亿美元。至此&#xff0c;红帽这家全球…

第7篇:Flowable-Modeler集成之Flowable源码编译

接上一篇&#xff1a; 第6篇&#xff1a;Flowable-Modeler详述之常见问题Table act_ge_property doesn’t exist https://blog.csdn.net/weixin_40816738/article/details/102899408 文章目录一、背景二、Flowable源码下载2.1. 参考文章&#xff1a;2.2. Flowable完整源码编译2…

众安每秒3.2万张保单的背后,阿里云输出了什么能力?

摘要&#xff1a; 当传统保险公司还在将“开门红”作为重中之重提前几个月做准备的时候&#xff0c;互联网保险公司关注的则是“双十一”和“双十二”。2017年双十一当日&#xff0c;刚刚在香港上市的众安保险的保单量突破3亿&#xff0c;比2014年增长超过200%。 点此查看原文&…

第8篇:Flowable-Modeler集成之Flowable-modeler源码编译

接上一篇&#xff1a; 第7篇&#xff1a;Flowable-Modeler集成之Flowable源码编译 https://blog.csdn.net/weixin_40816738/article/details/102899693 文章目录一、背景二、源码下载三、思路分析与目标3.1. 分析modeler3.2. Modeler模块编译&#xff0c;启动3.2.1. POM修改3.2…

iOS unrecognized selector crash 自修复技术实现与原理解析

摘要&#xff1a; 在开发中 unrecognized selector sent to instance XXXXX 是非常常见的 crash 类型。这篇博文主要介绍如何在客户端自修复该问题&#xff0c;并进行原理解析。 作者介绍&#xff1a;阿里云-移动云-大前端团队。 点此查看原文&#xff1a;http://click.aliyun.…

阿里测试环境运维及研发效率提升之道

摘要&#xff1a; 生产环境最关注的就是稳定&#xff0c;测试环境更关注的是研发效率&#xff0c;如何从一行代码最快的保证质量发到线上去&#xff0c;这个是我们测试环境最关注的。在全球运维大会上&#xff0c;阿里巴巴研发效能事业部运维中台技术专家——刘湘疆&#xff08…

首批8款5G手机获3C认证:华为占4款;IBM获AT&T“几十亿美元”云计算合同;马库斯:未来薪酬将以Libra发放...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

第9篇:Flowable-Modeler集成以及集成代码下载

接上一篇&#xff1a; 第8篇&#xff1a;Flowable-Modeler集成之Flowable-modeler源码编译 https://blog.csdn.net/weixin_40816738/article/details/102901026 文章目录一、背景二、代码修改&#xff0c;去除认证2.1. 修改拦截请求2.2. 修改用户查询信息2.3. 账号查询请求修改…

如何保障研发质量不踩坑?阿里技术专家教你几招

摘要&#xff1a; 面对自动化测试成本高、测试不稳定、测试无法严控发布质量等常见研发过程中的测试问题时&#xff0c;企业如何避免&#xff1f;如何保障研发质量&#xff1f;阿里巴巴研发效能事业部-研发协同平台高级技术专家李帅&#xff08;花名焦霸&#xff09;&#xff0…

保障了罗振宇跨年演讲的PTS铂金版正式上线,产品体验全新升级

摘要&#xff1a; 虽然2018年的跨年已经过去&#xff0c;但是对于今年各种新颖的跨年形式&#xff0c;不少人仍然意犹未尽。比如&#xff0c;罗振宇在深圳卫视和优酷直播的跨年演讲《时间的朋友》。据悉&#xff0c;当天现场参与人数近万&#xff0c;观看直播的观众多达百万。而…

第10篇:Flowable-BPMN操作流程部署、启动

接上一篇&#xff1a; 第9篇&#xff1a;Flowable-Modeler集成以及集成代码下载 https://blog.csdn.net/weixin_40816738/article/details/102901208 文章目录一、背景二、方案设计2.1. 流程部署2.2. 模型的转换2.3. 启动流程三、BPMN业务流程文件3.1. 启动flowable-idm3.2. 启…

那些年我们用过神级的代码注释

戳蓝字“CSDN云计算”关注我们哦&#xff01;来自&#xff1a;Blankj | 责编&#xff1a;乐乐链接&#xff1a;http://github.com/Blankj/awesome-comment正文 写在前面的话&#xff1a;一时兴起就收集了以下神注释&#xff0c;希望能为广大ITer带来快乐&#xff0c;缓解你们工…

AliOS Things 组件系统(uCube)

摘要&#xff1a; AliOS Things 是阿里巴巴提供的物联网操作系统&#xff0c;可以在不同的设备上运行不同的功能&#xff0c;甚至相同的设备运行不同的功能&#xff0c;AliOS Things 基于组件管理&#xff1a; 1、 组件功能单一&#xff0c;复用组件提供的功能&#xff0c;比如…

第11篇:Flowable-BPMN部署常见问题没有对ACT_RE_PROCDEF表进行插入操作

上一篇&#xff1a; 第10篇&#xff1a;Flowable-BPMN操作流程部署、启动 https://blog.csdn.net/weixin_40816738/article/details/102902348 文章目录一、问题描述二、问题定位三、解决方案四、验证结果一、问题描述 流程在部署的时候调用服务RepositoryService&#xff0c;…

AliOS Things lorawanapp应用介绍

摘要&#xff1a; 文本旨介绍AliOS Things的lorawanapp的示例&#xff0c;完成一个LoRaWAN网络的构建和数据传输&#xff0c;并通过该示例让大家对AliOS Things有一个初步的了解。 点此查看原文&#xff1a;http://click.aliyun.com/m/40591/ AliOS Things 是 AliOS 家族旗下的…

漫画:什么是最小生成树?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小灰来源 | 程序员小灰————— 第二天 —————————————————首先看看第一个例子&#xff0c;有下面这样一个带权图&#xff1a;它的最小生成树是什么样子呢&#xff1f;下图绿色加粗的边可以把所有顶点连…