【问题标题】:error cast connection on postgrespostgres 上的错误转换连接
【发布时间】:2012-01-07 18:09:17
【问题描述】:

大家晚安,这是我的第一个问题。

我在使用 tomcat webserver 运行 ZK 应用程序时遇到了一些问题

java.lang.ClassCastException: org.postgresql.jdbc4.Jdbc4Connection 无法转换为 controller.connection controller.connection.(connection.java:27) controller.lap_keuangan.lk_Controller.preparelistlk(lk_Controller.java:34) controller.lap_keuangan.lk_Controller.doAfterCompose(lk_Controller.java:30)

这是我的连接类:

package controller;

//import ommited


public class connection {

  private static final String url="jdbc:postgresql://192.168.56.101:5432/adempiere";
  private static final String user = "postgres";
  private static final String pwd = "auliaardy";
  private connection conn;

  public connection()throws Exception{
      try {
          DriverManager.registerDriver(new org.postgresql.Driver());
          conn =  (connection) DriverManager.getConnection(url,user,pwd);

      } catch (SQLException e) {
          System.out.println("Driver tidak ditemukan"+e);
      }
  }

  public Connection getConnection(){
      return (Connection) conn;
  }

  public void closeConnection(){
      try {
          conn.closeConnection();
      } catch (Exception e) {
          System.out.println("gagal menutup koneksi disebabkan: "+e);
      }
  }

  }

这是我的控制器类

//import ommited here

public class lk_Controller extends GenericForwardComposer {

    private Listbox listlk;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        preparelistlk();
    }

    public void preparelistlk() throws Exception {
        connection c = new connection();
        try {
            l_keuangan lk = new l_keuangan(c.getConnection());
            List<tbl_lk> llk = lk.getLKeuangan();
            ListModelList lml = new ListModelList(llk, true);
            listlk.setModel(lml);
            listlk.setItemRenderer(new ListitemRenderer() {

                @Override
                public void render(Listitem lslk, Object o) throws Exception {

                    try {

                        tbl_lk tl = (tbl_lk) o;
                        new Listcell(ubahtanggal()).setParent(lslk);
                        new Listcell(Integer.toString(tl.getSum_debit())).setParent(lslk);
                        new Listcell(Integer.toString(tl.getSum_credit())).setParent(lslk);
                        new Listcell(Integer.toString(tl.getTotal())).setParent(lslk);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public  String ubahtanggal() {
        tbl_lk lk = new tbl_lk();
        DateFormat df = new SimpleDateFormat("YYYY/MM/DD");
        long tanggal = lk.getTanggal().getTime();
        String tgl = df.format(tanggal);
        return tgl;




    }
}

tomcat 说行错误: DriverManager.registerDriver(new org.postgresql.Driver()); conn = (connection) DriverManager.getConnection(url,user,pwd);

我无法将投射连接更改为: conn = DriverManager.getConnection(url,user,pwd);

请大家帮忙,我被困了一夜T.T

【问题讨论】:

  • 在Java中,类名/构造函数通常以大写字母开头,变量和方法以小写字母开头,通常不包含下划线

标签: java casting connection zk


【解决方案1】:

DriverManager 对象返回java.sql.Connection 的实现。它不会返回您的 controller.connection 类的实例。你的conn 变量应该是java.sql.Connection 类型。

注意:

  • Java 中的类,按照惯例,总是以大写字母开头
  • 将您的类命名为connection,并使其包装类Connection 的对象,这真的很令人困惑。如此混乱,以至于您被自己的代码弄糊涂了。

【讨论】:

    【解决方案2】:

    改变这个:

    private connection conn;
    

    到这里:

    private Connection conn;
    

    还有这个:

    conn =  (connection) DriverManager.getConnection(url,user,pwd);
    

    到这里:

    conn =  DriverManager.getConnection(url,user,pwd);
    

    JDBC 的"Connection" 类以大写字母开头并位于java.sql 包中(全限定类名称为java.sql.Connection)。您不小心使用了小写字母 connection,这是您写入的类的名称,java.sql.Connection 无法转换。

    另外,在 Java 中,约定是使用 CamelCase 作为类名,并且类名不应以小写开头,因此最好将类重命名为 ConnectionUtilConnectionManager

    //
    // NOTE: must be in ConnectionManager.java
    //
    package controller;
    
    // imports ommited
    
    
    public class ConnectionManager {
    
      private static final String url="jdbc:postgresql://192.168.56.101:5432/adempiere";
      private static final String user = "postgres";
      private static final String pwd = "auliaardy";
      private Connection conn;
    
      public Connection() throws Exception{
          try {
              DriverManager.registerDriver(new org.postgresql.Driver());
              conn =  (Connection) DriverManager.getConnection(url,user,pwd);
    
          } catch (SQLException e) {
              System.out.println("Driver tidak ditemukan"+e);
          }
      }
    
      public Connection getConnection() {
          return conn;
      }
    
      public void closeConnection() {
          try {
              conn.closeConnection();
          } catch (Exception e) {
              System.out.println("gagal menutup koneksi disebabkan: "+e);
          }
      }
    
    }
    

    同样,您应该将lk_Controller 重命名为LKController。除非在 ZK 中,约定有些不同。

    【讨论】:

    • 我猜你的意思是“到这个:conn = DriverManager.getConnection(url,user,pwd);”
    • 您的第二次更改在两条线上都是相同的。我想你的意思是 conn = (Connection) DriverManager.getConnection(url,user,pwd);
    • 天哪,我忘记了我的班级名称和变量,谢谢先生它的作品:D
    • @aulia 不客气!顺便说一句,我希望那不是您的通用密码! :)
    • @Behrang Saeedzadeh 老实说,这不是我的密码先生:D
    猜你喜欢
    • 2023-03-03
    • 2018-07-13
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2017-06-14
    相关资源
    最近更新 更多