Свойство приложения AppEngine не заполняет URL

Следовал инструкциям и моей функции init() CloudSqlServlet.java:

   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: недопустимый экземпляр облака 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 ответ

Что касается вашего кода, все выглядит хорошо, за исключением окончания в строке, говоря </system-properties>mvгде у вас может быть опечатка в mv,

Возможно, это учебник, о котором вы говорили, но в любом случае я рекомендую вам взглянуть на официальную документацию по подключению приложения Java App Engine к Cloud SQL.

Что я вижу, я думаю, что вы, возможно, не изменили свойства приложения для вашего приложения с соответствующими значениями, и, возможно, у вас есть значения по умолчанию. Вы можете изменить их в pom.xml файл, который должен выглядеть следующим образом (дополнительная информация здесь тоже):

<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>

Ваше приложение будет извлекать свойства из этого файла, поэтому обязательно обновите ваши свойства соответствующими значениями.

Другие вопросы по тегам