由于基础异常,无法加载连接类:'java.lang.NumberFormatException:对于输入字符串:“OPENSHIFT_MYSQL_DB_PORT”'

时间:2015-05-14 09:49:45

标签: java mysql jersey openshift

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

  

连接数据库 -   com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:由于基础异常,无法加载连接类:'java.lang.NumberFormatException:对于输入字符串:“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));
  }

我尝试过以下但我仍然遇到同样的错误:

3 个答案:

答案 0 :(得分:3)

问题是因为这一行

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()函数。

答案 1 :(得分:0)

您可以将这些变量替换为以下内容。

       <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“可以从openshift phpmyadmin页面获取IP地址和端口号,它们通常显示在管理页面的顶部。

答案 2 :(得分:0)

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

  

'JDBC:MySQL的:// adminuname:adminpass@127.02.0.1:3306 /应用程序的名字'

。因此,使用该值为DriverManager.getConnection()创建url会给我们提供异常。 而是尝试知道存储在 $ OPENSHIFT_MYSQL_DB_HOST 中的值,然后将URL硬编码为没有该用户名和密码的String变量。像这样的东西

  

'JDBC:MySQL的://127.02.0.1:3306 /应用程序的名字'

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

I found this solution here.