AppEngine app属性未填充url

时间:2017-12-11 20:11:10

标签: java google-app-engine google-cloud-sql cloud-sql-proxy

遵循教程和我的CloudSqlServlet.java init()函数:

   try {
        ApiProxy.Environment env = ApiProxy.getCurrentEnvironment();
        Map<String, Object> attr = env.getAttributes();
    String hostname = (String) attr.get("com.google.appengine.runtime.default_version_hostname");

    String url = hostname.contains("localhost:")
            ? System.getProperty("cloudsql-local") : System.getProperty("cloudsql");
    log("connecting to: " + url);
    try {
        conn = DriverManager.getConnection(url);
    } catch (SQLException e) {
        throw new ServletException("Unable to connect to Cloud SQL", e);
    }

这是我的appegnine-web.xml:

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <version>1</version>
  <threadsafe>true</threadsafe>
  <runtime>java8</runtime>

  <use-google-connector-j>true</use-google-connector-j>

  <service>cloudsql</service>

  <system-properties>
    <property name="cloudsql" value="jdbc:google:mysql://${INSTANCE_CONNECTION_NAME}/${database}?user=${user}&amp;password=${password}" />
    <property name="cloudsql-local" value="jdbc:mysql://google/${database}?useSSL=false&amp;cloudSqlInstance=${INSTANCE_CONNECTION_NAME}&amp;socketFactory=com.google.cloud.sql.mysql.SocketFactory&amp;user=${user}&amp;password=${password}" />
  </system-properties>
</appengine-web-app>

该应用程序使用maven编译。然后我在一个终端中运行appengine服务器:

mvn appengine:run

在另一个终端,我将运行sql代理:

./cloud_sql_proxy -instances=skeleton-182342:europe-west1:trial1131=tcp:3306

然后当我在本地访问服务器时:localhost:8080/cloudsql 该应用程序抛出异常:

  

引起:java.lang.IllegalArgumentException:无效的Cloud SQL   实例[$ {INSTANCE_CONNECTION_NAME}],表单中的预期值   [项目:区域:名称]

在日志中我可以看到属性没有插入到url:

log: CloudSQL: connecting to: jdbc:mysql://google/${database}?useSSL=false&cloudSqlInstance=${INSTANCE_CONNECTION_NAME}&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=${user}&password=${password}

1 个答案:

答案 0 :(得分:0)

至于你的代码,一切看起来都很好,除了</system-properties>mv行中的结尾,你可能在mv中输入错字。

也许这是您正在讨论的教程,但无论如何,我建议您查看official documentation以将Java App Engine应用程序连接到Cloud SQL。

对于我看到的内容,我认为您可能没有使用适当的值更改应用程序的应用程序属性,也许您有默认值。您可以在pom.xml文件中更改它们,该文件应如下所示(其他信息here也是如此):

<properties>
    <INSTANCE_CONNECTION_NAME>PROJECT:REGION:INSTANCE</INSTANCE_CONNECTION_NAME>
    <user>USER</user>
    <password>PASSWORD</password>
    <database>DB_NAME</database>

    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
  </properties>

您的应用程序将从该文件中检索属性,因此请务必使用相应的值更新您的属性。