1

AsyncCallback呼び出しでオブジェクトのリストを取得しようとしています。onSuccessプロシージャのリストデータを見るまで、すべてが正常に見えます。実際、正しい行数のリストを受け取りましたが、すべての行はSQLステートメントによって最後に取得されたものと同じです。

これは、EntryPointクライアントモジュールです。

package com.fantaprica.client;

import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.fantaprica.shared.GameDay;


/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Fantaprica implements EntryPoint {

private final ODBConnectionAsync odbconnectionSvc = GWT
        .create(ODBConnection.class);

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */

public void onModuleLoad() {

    odbconnectionSvc
            .getGameDayList(new AsyncCallback<List<GameDay>>() {
                public void onFailure(Throwable caught) {
                }

                public void onSuccess(List<GameDay> result) {

                    System.out.println("#########################################");
                    System.out.println("OnModuleLoad");
                    for (int i = 0; i < result.size(); i++) {
                        System.out.println("index="+i);
                        System.out.println("result.get(i).getGameDayCompetition()="+result.get(i).getGameDayCompetition());
                        System.out.println("result.get(i).getGameDayCupFl()"+result.get(i).getGameDayCupFl());
                        System.out.println("result.get(i).getGameDayId()="+result.get(i).getGameDayId());
                        System.out.println("result.get(i).getGameDayOrder()="+result.get(i).getGameDayOrder());                                         
                        System.out.println("result.get(i).getGameDaySeason()="+result.get(i).getGameDaySeason());
                    }
                }
            });
}
}

これはサーバー側での実装です。

package com.fantaprica.server;

import java.text.ParseException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Connection2DB {

public static ResultSet resultset(String p_sql_statement) throws ParseException {

    //String db_file_name_prefix = "/home/dario/workspace/fantaprica/src/com/fantaprica/server/database/database";
    //String db_file_name_prefix = "/home/dario/workspace/fantaprica/war/database/database";
    String db_file_name_prefix = "/home/dario/Workspace/Fantaprica/war/fantaprica/database/database";
    Connection con = null;

    // connect to the database. This will load the db files and start the
    // database if it is not alread running.
    // db_file_name_prefix is used to open or create files that hold the
    // state
    // of the db.
    // It can contain directory names relative to the
    // current working directory
    try {
        Class.forName("org.hsqldb.jdbcDriver");
        con = DriverManager.getConnection("jdbc:hsqldb:file:"
                + db_file_name_prefix, // filenames prefix
                "sa", // user
                ""); // pass
        Statement statement = con.createStatement();
        ResultSet rs = statement.executeQuery(p_sql_statement);
        System.out.println("query "+p_sql_statement+" eseguita");
        statement.close();
        con.close();
        return rs;
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(TestConnection.class.getName()).log(Level.SEVERE,
                null, ex);
        System.out.println("errore "+ex.toString());
        return null;
    } catch (SQLException ex) {
        Logger.getLogger(TestConnection.class.getName()).log(Level.SEVERE,
                null, ex);
        ex.printStackTrace();
        System.out.println("errore "+ex.toString());
        return null;
    }

}

public static void  execstmt(String p_sql_statement) throws ParseException {

    String db_file_name_prefix = "/home/dario/Workspace/Fantaprica/war/fantaprica/database/database";
    Connection con = null;

    // connect to the database. This will load the db files and start the
    // database if it is not alread running.
    // db_file_name_prefix is used to open or create files that hold the
    // state
    // of the db.
    // It can contain directory names relative to the
    // current working directory
    try {
        Class.forName("org.hsqldb.jdbcDriver");
        con = DriverManager.getConnection("jdbc:hsqldb:file:"
                + db_file_name_prefix, // filenames prefix
                "sa", // user
                ""); // pass
        Statement statement = con.createStatement();
        statement.executeUpdate(p_sql_statement);

        System.out.println("statement "+p_sql_statement+" eseguito");

        statement.close();
        con.close();

    } catch (ClassNotFoundException ex) {
        Logger.getLogger(TestConnection.class.getName()).log(Level.SEVERE,
                null, ex);
        System.out.println("errore "+ex.toString());

    } catch (SQLException ex) {
        Logger.getLogger(TestConnection.class.getName()).log(Level.SEVERE,
                null, ex);
        ex.printStackTrace();
        System.out.println("errore "+ex.toString());
    }

}

}

コードを実行すると、次の結果が得られます。

#########################################
ODBConnectionImpl
Start creating the list
scanning resultset
v_game_day_tmp.getGameDayCompetition()=campionato
v_game_day_tmp.getGameDayCupFl()=false
v_game_day_tmp.getGameDayId()=0
v_game_day_tmp.getGameDayOrder()15
v_game_day_tmp.getGameDaySeason()2012/2013
0
index=0
v_game_day_list.get(i).getGameDayCompetition()=campionato
v_game_day_list.get(i).getGameDayCupFl()=false
v_game_day_list.get(i).getGameDayId()=0
v_game_day_list.get(i).getGameDayOrder()=15
v_game_day_list.get(i).getGameDaySeason()=2012/2013
scanning resultset
v_game_day_tmp.getGameDayCompetition()=campionato
v_game_day_tmp.getGameDayCupFl()=false
v_game_day_tmp.getGameDayId()=1
v_game_day_tmp.getGameDayOrder()14
v_game_day_tmp.getGameDaySeason()2012/2013
1
index=1
v_game_day_list.get(i).getGameDayCompetition()=campionato
v_game_day_list.get(i).getGameDayCupFl()=false
v_game_day_list.get(i).getGameDayId()=1
v_game_day_list.get(i).getGameDayOrder()=14
v_game_day_list.get(i).getGameDaySeason()=2012/2013
scanning resultset
v_game_day_tmp.getGameDayCompetition()=campionato
v_game_day_tmp.getGameDayCupFl()=false
v_game_day_tmp.getGameDayId()=2
v_game_day_tmp.getGameDayOrder()13
v_game_day_tmp.getGameDaySeason()2012/2013
2
index=2
v_game_day_list.get(i).getGameDayCompetition()=campionato
v_game_day_list.get(i).getGameDayCupFl()=false
v_game_day_list.get(i).getGameDayId()=2
v_game_day_list.get(i).getGameDayOrder()=13
v_game_day_list.get(i).getGameDaySeason()=2012/2013
scanning resultset
v_game_day_tmp.getGameDayCompetition()=mundialito
v_game_day_tmp.getGameDayCupFl()=false
v_game_day_tmp.getGameDayId()=3
v_game_day_tmp.getGameDayOrder()12
v_game_day_tmp.getGameDaySeason()2012/2013
3
index=3
v_game_day_list.get(i).getGameDayCompetition()=mundialito
v_game_day_list.get(i).getGameDayCupFl()=false
v_game_day_list.get(i).getGameDayId()=3
v_game_day_list.get(i).getGameDayOrder()=12
v_game_day_list.get(i).getGameDaySeason()=2012/2013
list created
#########################################
OnModuleLoad
index=0
result.get(i).getGameDayCompetition()=mundialito
result.get(i).getGameDayCupFl()false
result.get(i).getGameDayId()=3
result.get(i).getGameDayOrder()=12
result.get(i).getGameDaySeason()=2012/2013
index=1
result.get(i).getGameDayCompetition()=mundialito
result.get(i).getGameDayCupFl()false
result.get(i).getGameDayId()=3
result.get(i).getGameDayOrder()=12
result.get(i).getGameDaySeason()=2012/2013
index=2
result.get(i).getGameDayCompetition()=mundialito
result.get(i).getGameDayCupFl()false
result.get(i).getGameDayId()=3
result.get(i).getGameDayOrder()=12
result.get(i).getGameDaySeason()=2012/2013
index=3
result.get(i).getGameDayCompetition()=mundialito
result.get(i).getGameDayCupFl()false
result.get(i).getGameDayId()=3
result.get(i).getGameDayOrder()=12
result.get(i).getGameDaySeason()=2012/2013

ご覧のとおり、リストはODBConnectionImplで正しく作成され、4つの異なる行で構成されています。しかし、AsyncCallback呼び出しに返されたリストをスキャンすると、4つの等しい行があり、すべてResultSetの最後の行と同じです。

助けとアドバイスをありがとう、ダリオ

4

2 に答える 2

0

newnoiseさん、SHIv16さん、すみません、コピペを間違えました。これは getGameDayList プロシージャのコードです

public List<GameDay> getGameDayList() {
    // TODO Auto-generated method stub

    List<GameDay> v_game_day_list = new ArrayList<GameDay>();
    GameDay v_game_day_tmp = new GameDay();
    String v_sql_statement;

    try {

        v_sql_statement = "SELECT T1.\"game_day_id\",T1.\"game_day_date\",T1.\"game_day_competition\","
                + " T1.\"game_day_season\",T1.\"game_day_cup_fl\",T1.\"game_day_order\""
                + " FROM \"game_days\" T1 ORDER BY T1.\"game_day_order\" DESC";
        System.out.println("   -------   -------   -------");
        System.out.println("classe ODBConnectionImpl");
        System.out.println("getGameDayList");
        System.out.println("esecuzione statement " + v_sql_statement);
        ResultSet rs = Connection2DB.resultset(v_sql_statement);
        System.out.println("query eseguita");

        int i = 0;

        System.out.println("#########################################");
        System.out.println("ODBConnectionImpl");
        System.out.println("Start creating the list");

        while (rs.next()) {
            v_game_day_tmp.getGameDay(rs.getDate("game_day_date"),
                    rs.getString("game_day_competition"),
                    rs.getString("game_day_season"),
                    rs.getBoolean("game_day_cup_fl"),
                    rs.getInt("game_day_id"), rs.getInt("game_day_order"));

            System.out.println("scanning resultset");
            System.out.println("v_game_day_tmp.getGameDayCompetition()="+v_game_day_tmp.getGameDayCompetition());
            System.out.println("v_game_day_tmp.getGameDayCupFl()="+v_game_day_tmp.getGameDayCupFl());
            System.out.println("v_game_day_tmp.getGameDayId()="+v_game_day_tmp.getGameDayId());
            System.out.println("v_game_day_tmp.getGameDayOrder()"+v_game_day_tmp.getGameDayOrder());
            System.out.println("v_game_day_tmp.getGameDaySeason()"+v_game_day_tmp.getGameDaySeason());
            System.out.println(i);

            v_game_day_list.add(v_game_day_tmp);

            System.out.println("index="+i);
            System.out.println("v_game_day_list.get(i).getGameDayCompetition()="+v_game_day_list.get(i).getGameDayCompetition());
            System.out.println("v_game_day_list.get(i).getGameDayCupFl()="+v_game_day_list.get(i).getGameDayCupFl());
            System.out.println("v_game_day_list.get(i).getGameDayId()="+v_game_day_list.get(i).getGameDayId());
            System.out.println("v_game_day_list.get(i).getGameDayOrder()="+v_game_day_list.get(i).getGameDayOrder());
            System.out.println("v_game_day_list.get(i).getGameDaySeason()="+v_game_day_list.get(i).getGameDaySeason());

            i++;

        }

        for(i=0;i<v_game_day_list.size();i++)
            System.out.println("secondo loop v_game_day_list.get(i).getGameDayId()="+v_game_day_list.get(i).getGameDayId());


        System.out.println("list created");
        return v_game_day_list;

    } catch (SQLException e) {
        System.out.println("ODBConnectionImpl SQLException: "
                + e.toString());
        return null;
    } catch (ParseException e) {
        System.out.println("ODBConnectionImpl ParseException: "
                + e.toString());
        return null;
    }

}

これは、共有クラス GameDay のコードです。

package com.fantaprica.shared;

import java.util.Date;
import java.io.Serializable;

@SuppressWarnings("serial")
public class GameDay implements Serializable {

private int v_game_day_id;
private Date v_game_day_date;
private String v_game_day_competition;
private String v_game_day_season;
private boolean v_game_day_cup_fl;
private int v_game_day_order;

public GameDay() {
    // TODO Auto-generated constructor stub

}

// questo metodo viene uitilizzato per l'UPDATE
public void setGameDay(int p_game_day_id,Date p_game_day_date, String p_game_day_competition,
        String p_game_day_season, boolean p_game_day_cup_fl) {

    v_game_day_id = p_game_day_id;
    v_game_day_date = p_game_day_date;
    v_game_day_competition = p_game_day_competition;
    v_game_day_season = p_game_day_season;
    v_game_day_cup_fl = p_game_day_cup_fl;

}

// questo metodo viene utilizzato per l'INSERT
public void setGameDay(Date p_game_day_date, String p_game_day_competition,
        String p_game_day_season, boolean p_game_day_cup_fl) {

    v_game_day_date = p_game_day_date;
    v_game_day_competition = p_game_day_competition;
    v_game_day_season = p_game_day_season;
    v_game_day_cup_fl = p_game_day_cup_fl;

}

public void getGameDay(Date p_game_day_date, String p_game_day_competition,
        String p_game_day_season, boolean p_game_day_cup_fl,
        int p_game_day_id, int p_game_day_order) {

    v_game_day_date = p_game_day_date;
    v_game_day_competition = p_game_day_competition;
    v_game_day_season = p_game_day_season;
    v_game_day_cup_fl = p_game_day_cup_fl;
    v_game_day_id = p_game_day_id;
    v_game_day_order = p_game_day_order;
}

public Date getGameDayDate() {
    return v_game_day_date;
}

public String getGameDayCompetition() {
    return v_game_day_competition;
}

public String getGameDaySeason() {
    return v_game_day_season;
}

public boolean getGameDayCupFl() {
    return v_game_day_cup_fl;
}

public int getGameDayId() {
    return v_game_day_id;
}

public int getGameDayOrder() {
    return v_game_day_order;
}
}

問題はthrクラスの属性の「静的」実装である可能性があることを読みましたが、GameDayクラスには静的属性がないため、この場合ではありません

ダリオ

于 2013-01-22T21:12:58.667 に答える
0

getGameDayList のコードに問題があると思います。

List<GameDay> v_game_day_list = new ArrayList<GameDay>();
GameDay v_game_day_tmp = new GameDay();
String v_sql_statement;

このコード ブロックから GameDay v_game_day_tmp = new GameDay() を削除します。

あなたがしていることは、同じオブジェクト (v_game_day_tmp) をリストで 4 回使用していることです。while ループが v_game_day_tmp を再生成してリストに追加すると、リスト内の以前のエントリはまだ同じオブジェクト (v_game_day_tmp) を参照しているため、必然的に同じ値になります。

1 つの一時オブジェクトを使用しないでください。

オブジェクトは new() で再作成し、入力してからリストに追加する必要があります。

単純に GameDay を動かす v_game_day_tmp = new GameDay(); while(rs.next()) の最初の行になると、問題が解決するはずです。

よろしく。

于 2013-01-22T23:00:04.520 に答える