Closed NicolaSpreafico closed 5 years ago
Just an initial guess, but this may be related to the version of cloud-sql-jdbc-socket-factory in 1.1.1
vs 1.1.2
.
Try adding this dependency to your pom.xml
at the very top:
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>mysql-socket-factory</artifactId>
<version>1.0.11</version>
</dependency>
@kurtisvg @ludoch
This is the result:
I'm now getting a different type of error:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cloud.autoconfigure.RefreshAutoConfiguration$JpaInvokerConfiguration': Invocation of init method failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cloudSqlDataSourceProperties' defined in class path resource [org/springframework/cloud/gcp/autoconfigure/sql/GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties]: Factory method 'cloudSqlDataSourceProperties' threw exception; nested exception is java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cloudSqlDataSourceProperties' defined in class path resource [org/springframework/cloud/gcp/autoconfigure/sql/GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties]: Factory method 'cloudSqlDataSourceProperties' threw exception; nested exception is java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cloudSqlDataSourceProperties' defined in class path resource [org/springframework/cloud/gcp/autoconfigure/sql/GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties]: Factory method 'cloudSqlDataSourceProperties' threw exception; nested exception is java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties]: Factory method 'cloudSqlDataSourceProperties' threw exception; nested exception is java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
Caused by: java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
Caused by: java.lang.ClassNotFoundException: com.google.cloud.sql.core.CoreSocketFactory
Ah, you're right, the package name changed there as well. Can you also try adding this bean to your application context to override the default one?
@Bean
@Primary
public DataSourceProperties cloudSqlDataSourceProperties(
GcpCloudSqlProperties gcpCloudSqlProperties,
DataSourceProperties properties,
GcpProperties gcpProperties,
CloudSqlJdbcInfoProvider cloudSqlJdbcInfoProvider) {
if (StringUtils.isEmpty(properties.getUsername())) {
properties.setUsername("root");
LOGGER.warn("spring.datasource.username is not specified. "
+ "Setting default username.");
}
if (StringUtils.isEmpty(properties.getDriverClassName())) {
properties.setDriverClassName(cloudSqlJdbcInfoProvider.getJdbcDriverClass());
}
else {
LOGGER.warn("spring.datasource.driver-class-name is specified. " +
"Not using generated Cloud SQL configuration");
}
if (StringUtils.isEmpty(properties.getUrl())) {
properties.setUrl(cloudSqlJdbcInfoProvider.getJdbcUrl());
}
else {
LOGGER.warn("spring.datasource.url is specified. "
+ "Not using generated Cloud SQL configuration");
}
if (gcpCloudSqlProperties.getCredentials().getEncodedKey() != null) {
setCredentialsEncodedKeyProperty(gcpCloudSqlProperties);
}
else {
setCredentialsFileProperty(gcpCloudSqlProperties, gcpProperties);
}
System.setProperty(SslSocketFactory.USER_TOKEN_PROPERTY_NAME,
"spring-cloud-gcp-sql/"
+ this.getClass().getPackage().getImplementationVersion());
return properties;
}
If you are using mvn appengine:run
to execute the sample, this is expected. The last couple versions of the JDBC SF use threading to perform calls asynchronously, and the J8 App Engine emulator attempts to substitute the special App Engine thread (which is supplied in the AppEngine SDK).
If you use something like Jetty (mvn jetty:run
) when running locally, everything will work without the AppEngine SDK.
@kurtisvg If it works with jetty:run
but not with appengine:run
would it still work on the actual App Engine though?
Yes, for two reasons:
/cloudsql/
socket and the threads aren't initialized. If you are concerned about some difference in behavior, you can continue to use the emulator instead mvn appengine:run
, just make the App Engine SDK is available.
Hello,
first of all I can confirm that with the online App Engine environment there is no problem. Using 1.1.2.RELEASE
version the connection is properly made:
[Request8E6D6CE6] o.s.c.g.a.s.GcpCloudSqlAutoConfiguration : App Engine JdbcUrl provider. Connecting to jdbc:google:mysql://project:zone:instance-name/schema with driver com.mysql.jdbc.GoogleDriver
So the reported problem affects only localhost environment.
In my case I'm using Google Cloud Tools for Eclipse
to run dev-server, basing on your previous comments I think this method rely on appengine:run
I also tried with appengine:run
directly from terminal and the error is the same.
Considering all, besides continuing using the 1.1.1.RELEASE
version, the quickiest way I found to continuing running dev-server with built-in Eclipse plugin is creating 2 maven profiles, one for localhost and for online environment.
<profiles>
<profile>
<id>localhost</id>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.appengine/appengine-api-1.0-sdk -->
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
</dependency>
</dependencies>
</profile>
<profile>
<id>production</id>
</profile>
</profiles>
@etanshaul who works on Cloud Tools. It looks like the local App Engine emulator is just not quiet the same as the real one in this respect.
Hello,
I have a Google App Engine project based on Spring Boot (https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/appengine-standard-java8/springboot-appengine-standard)
I'm using the provided configuration in this page: https://github.com/spring-cloud/spring-cloud-gcp
to connecto to Cloud SQL, this is the content for application.properties file:
During server startup I'm getting this error:
TL;DR
It seems that somehow a
ThreadManager
class is required, which is provided by App Engine SDK. I can solve this issue in 2 different ways:I can add the required dependency:
I can revert the version back to
1.1.1.RELEASE
Is this an error? Is this a required dependency while using the
1.1.2.RELEASE
version?This kind of SDK is related only to Standard GAE (in order to use tasks, memcache, datastore, ...) but this is not my case.
Thanks