一、问题描述
在导入的 Apollo 配置开源项目中,启动主程序 ApolloApplication ,报出了一下错误:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-05-28 16:09:04.559 ERROR 12052 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162)
......
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142)
......
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'configServiceAutoConfiguration' defined in file [C:\Projects\apollo\apollo-configservice\target\classes\com\ctrip\framework\apollo\configservice\ConfigServiceAutoConfiguration.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bizConfig': Invocation of init method failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
......
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bizConfig': Invocation of init method failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160)
......
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:259)
......
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
......
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'serverconf0_.Cluster' in 'field list'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
......
复制代码
二、分析原因
Idea 打印了多个 caused by,因为最新的一个是一切所有相关问题的根源,因此,可以从最新的一个 Caused by 下手,也就是:
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'serverconf0_.Cluster' in 'field list'
复制代码
这个错误说明 serverconf0_.Cluster 的列不存在。
这里有两个库 apolloportaldb 和 apolloconfigdb,由于只是用到了 apollo-adminservice。因此,可以去 apollo-adminservice 涉及的数据库脚本文件 apolloconfigdb.sql,查看是否该文件内容中有遗漏。
发现只有 ServerConfig 数据库表的字段里有 Cluster,其他的表并没有涉及。
DROP TABLE IF EXISTS `ServerConfig`;
CREATE TABLE `ServerConfig` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增Id',
`Key` varchar(64) NOT NULL DEFAULT 'default' COMMENT '配置项Key',
`Cluster` varchar(32) NOT NULL DEFAULT 'default' COMMENT '配置对应的集群,default为不针对特定的集群',
`Value` varchar(2048) NOT NULL DEFAULT 'default' COMMENT '配置项值',
`Comment` varchar(1024) DEFAULT '' COMMENT '注释',
`IsDeleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '1: deleted, 0: normal',
`DataChange_CreatedBy` varchar(64) NOT NULL DEFAULT 'default' COMMENT '创建人邮箱前缀',
`DataChange_CreatedTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`DataChange_LastModifiedBy` varchar(64) DEFAULT '' COMMENT '最后修改人邮箱前缀',
`DataChange_LastTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`Id`),
KEY `IX_Key` (`Key`),
KEY `DataChange_LastTime` (`DataChange_LastTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置服务自身配置';
复制代码
这下就有些奇怪了,再搜索了一下,根本没有这个表 serverconf0_ 存在。
暂时想不到原因所在,那么,就只好看看配置启动的参数,数据库是哪个,看看那个库里到底有没有对应的表和字段。
这才发现,配置的数据库不正确,使用的是 ApolloPortalDB 。那么,不管怎么样,程序肯定无法在这个 ApolloPortalDB 库中找到 ApolloConfigDB 库中的表和字段的。
因此,就先把数据库更改为正确的,再看下运行情况。
三、验证效果
经过以上分析之后,再重新启动主程序 ApolloApplication ,并未报错,浏览器也能够正确访问 localhost:8080 地址,这下说明可以了。
四、多个 Caused by
如果在 Idea 中,对于某个异常,打印出多个 Caused by,那么,选择,最新的那个即可。
这也符合程序逻辑,因为,程序始终是顺序执行的,最新的那个才是问题的根源。
评论