【发布时间】:2018-04-12 07:54:53
【问题描述】:
我正在使用 Spring Boot 与 Google App Engine 和 Google Cloud SQL,使用 MySQL。。在本地它工作正常,但在部署到 Google App Engine 后,该站点没有加载。我检查了 Google 的错误报告,发现了这个异常。
请建议如何解决这个问题。
在我的 application.properties
spring.jpa.database=MYSQL
spring.datasource.url=jdbc:mysql://google/<<DB_NAME>>?socketFactory=com.google.cloud.sql.mysql.SocketFactory&cloudSqlInstance=<<Instance connection name>>
spring.datasource.username=<<username>>
spring.datasource.password=<<pwd>>
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.hibernate.ddl-auto=update
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
例外:
org.springframework.beans.factory.BeanCreationException: 错误 创建在类路径中定义的名称为“entityManagerFactory”的bean 资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 调用 init 方法失败;嵌套异常是 javax.persistence.PersistenceException:[PersistenceUnit:默认] 无法在以下位置构建 Hibernate SessionFactory org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1710) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1085) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:858) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:327) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:155) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:135) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87) 在 org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172) 在 org.eclipse.jetty.plus.annotation.ContainerInitializer.callStartup(ContainerInitializer.java:140) 在 org.eclipse.jetty.annotations.ServletContainerInitializersStarter.doStart(ServletContainerInitializersStarter.java:63) 在 org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 在 org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:330) 在 org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1406) 在 org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1368) 在 org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778) 在 org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262) 在 org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:522) 在 org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 在 com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:244) 在 com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:182) 在 com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:97) 在 com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:680) 在 com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:642) 在 com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:612) 在 com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run(JavaRuntime.java:806) 在 com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:274) 在 java.lang.Thread.run(Thread.java:745) 引起: javax.persistence.PersistenceException:[PersistenceUnit:默认] 无法在以下位置构建 Hibernate SessionFactory org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:970) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:895) 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:388) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1769) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1706) ... 36 更多 原因: org.hibernate.exception.JDBCConnectionException:无法打开 JDBC 用于 DDL 执行的连接 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 在 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:69) 在 org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60) 在 org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcDatabaseMetaData(ImprovedExtractionContextImpl.java:67) 在 org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getTables(InformationExtractorJdbcDatabaseMetaDataImpl.java:329) 在 org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.getTablesInformation(DatabaseInformationImpl.java:120) 在 org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:65) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:312) 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892) ... 43 更多原因: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 无法创建与数据库服务器的连接。在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.Util.getInstance(Util.java:386) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2492) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2235) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:818) 在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:307) 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117) 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123) 在 com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:365) 在 com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:194) 在 com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:460) 在 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:534) 在 com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) 在 com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) 在 org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) 在 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) 在 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ... 55 更多原因:java.lang.RuntimeException:无法获取 与 Cloud SQL API 通信的凭据 com.google.cloud.sql.core.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:549) 在 com.google.cloud.sql.core.SslSocketFactory.getInstance(SslSocketFactory.java:140) 在 com.google.cloud.sql.mysql.SocketFactory.connect(SocketFactory.java:48) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:300) 在 com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2416) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2450) ... 76 更多原因:java.io.IOException:应用程序默认值 凭据无法创建 Google App Engine 服务帐号 凭证类 com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential$AppEngineCredentialWrapper。 检查组件“google-api-client-appengine”是否已部署。 在 com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getAppEngineCredential(DefaultCredentialProvider.java:315) 在 com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredentialUnsynchronized(DefaultCredentialProvider.java:119) 在 com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredential(DefaultCredentialProvider.java:91) 在 com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:213) 在 com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:191) 在 com.google.cloud.sql.core.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:547) ... 81 更多原因:java.lang.ClassNotFoundException: com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential$AppEngineCredentialWrapper 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 com.google.apphosting.runtime.ApplicationClassLoader.findClass(ApplicationClassLoader.java:45) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 java.lang.Class.forName0(本机方法)在 java.lang.Class.forName(Class.java:265) 在 com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.forName(DefaultCredentialProvider.java:161) 在 com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getAppEngineCredential(DefaultCredentialProvider.java:300) ... 86 更多
【问题讨论】:
-
你是按照教程还是你自己的代码?另外,您是否启用了the Cloud SQL API?
-
这是我自己的代码(来自 Google 的参考)。是的,我启用了 Cloud SQL。
-
在这种情况下,一个好的方法是按照教程进行操作,然后在教程开始工作后,逐步添加您自己的代码。 this one 是与您的情况相近的示例,因为它使用 Spring Boot、App Engine Flexible 和 Cloud Sql。
标签: mysql google-app-engine spring-boot google-cloud-platform google-cloud-sql