无法加载连接 class,因为基础异常:'java.lang.NumberFormatException: For input string: "OPENSHIFT_MYSQL_DB_PORT"'

Cannot load connection class because of underlying exception: 'java.lang.NumberFormatException: For input string: "OPENSHIFT_MYSQL_DB_PORT"'

我正在尝试在 openshift 上部署我的 Jersey 项目。我已经实现了这个苹果 class 来测试另一个 class 中的错误,因为我猜问题出在建立数据库连接上。在 Tails 日志中我发现了这个错误:

Connecting to database… com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Cannot load connection class because of underlying exception: 'java.lang.NumberFormatException: For input string: "OPENSHIFT_MYSQL_DB_PORT"'. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

package org.busTracker.serverSide;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class Apple {

   //I modified my credients.
    String host = "jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:OPENSHIFT_MYSQL_DB_PORT/serverside";
    String user = "adminBjv5a4k";
    String password = "7tvPb1Bx3v8j";

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {

        Connection conn = null;  
        try {    
          Class.forName("com.mysql.jdbc.Driver");    
          System.out.println("Connecting to database…");    
          conn = DriverManager.getConnection(host,user,password);    
        } catch (Exception e) {    
          e.printStackTrace();    
        } finally {    
          if (conn != null) {    
            try {    
              conn.close();    
            } catch (SQLException e) {    
              // ignore    
            }    
          }    
        }   

        return "Hello, from apple class   14.05.15 11:35!";
    }

}

编辑: 我在 DriverManager.getConnection() 之后的 try 块中添加了以下内容:

  Map<String, String> env = System.getenv();
  for (String envName : env.keySet()) {
      System.out.format("%s=%s%n",
                        envName,
                        env.get(envName));
  }

我尝试了以下方法,但仍然出现相同的错误:

问题是因为这条线

String host = "jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:OPENSHIFT_MYSQL_DB_PORT/serverside";

获取环境变量需要使用方法System.getEnv().get("[the variable name]")。因此,在您的情况下,主机变量应如下所示

String host = "jdbc:mysql://" 
              + System.getenv().get("OPENSHIFT_MYSQL_DB_HOST") 
              + ":" 
              + System.getenv().get("OPENSHIFT_MYSQL_DB_PORT") 
              + "/serverside";

顺便说一下,您的编辑不起作用,因为应用程序在执行代码之前已经抛出异常。所以,要让它工作,你需要把它 before 放在 DriverManager.getConnection() 函数中。

您可以按如下方式替换这些变量。

       <property name="url"                                                                                                              
      value="jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/
       yourdatabasename" />

       can be replaced as below.

     <property name="url"  
    value="jdbc:mysql://127.12.97.2:3306/yourdatabasename"
    />

jdbc:mysql://127.12.97.2:3306/yourdatabasename"IP地址和端口号可以从openshift phpmyadmin页面获取,通常显示在最上面管理页面。

我尝试了以上所有解决方案,但都没有解决我的问题。所以任何仍然遇到异常的人,试试这个。 存储在环境变量 $OPENSHIFT_MYSQL_DB_HOST 中的值类似于

'jdbc:mysql://adminuname:adminpass@127.02.0.1:3306/appname'

。因此,使用该值为 DriverManager.getConnection() 创建 url 会给我们带来异常。 相反,尝试知道存储在 $OPENSHIFT_MYSQL_DB_HOST 中的值,然后将 url 硬编码到没有该用户名和密码的字符串变量中。像这样

'jdbc:mysql://127.02.0.1:3306/appname'

对我来说,它在进行此修改后开始工作。所有其他环境变量都可以按原样使用。

I found this solution here.