0

Eclipse で最初の MySQLConnection を作成しようとしていますが、authenticateUser で「この行に複数のマーカーがあります - 戻り値の型は DBConnection.authenticateUser(String, String) と互換性がありません」というエラーが表示されます。

これは、「複数のエラーが発生している...しかし、問題を解決できない...」という意味だと理解しています。

http://altair.cs.oswego.edu/~tenberge/tenbergen.org/misc/DB-Access-in-GWT-The-Missing-Tutorial.pdfをガイドとして使用しています。

これは私のコードです:

AwardTracker.gwt.xml

<module>
<inherits name="com.google.gwt.user.User"/>
<inherits name="com.google.gwt.user.theme.standard.Standard"/>
<entry-point class="org.AwardTracker.client.AwardTracker"/>

<!--  servelet context - path is arbitrary, but must match up with the rpc init inside java class -->
<!--  Tomcat will listen for this from the server and waits for rpc request in this context -->
<servelet class="org.AwardTracker.server.MySQLConnection" 
    path="/MySQLConnection" />
    <inherits name="com.google.gwt.user.theme.standard.Standard"/>
    <inherits name="com.google.gwt.user.theme.chrome.Chrome"/>
    <inherits name="com.google.gwt.user.theme.dark.Dark"/>

User.java

package org.AwardTracker.client;

import com.google.gwt.user.client.rpc.IsSerializable;

public class User implements IsSerializable {
@SuppressWarnings("unused")
private String username;
@SuppressWarnings("unused")
private String password;
@SuppressWarnings("unused")
private User() {
    //just here because GWT wants it.
}
public User(String username, String password) {
    this.username = username;
    this.password = password;
}

}


MySQLConnection.java

package org.AwardTracker.server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import org.AwardTracker.client.DBConnection;
import org.AwardTracker.client.User;

public class MySQLConnection extends RemoteServiceServlet implements DBConnection {
private Connection conn = null;
private String status;
private String url = "jbdc:mysql://localhost/awardtracker";
private String user = "DBuser";
private String pass = "DBpass";
public MySQLConnection() {
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        conn = DriverManager.getConnection(url, user, pass);
    } catch (Exception e) {
        //NEVER catch exceptions like this
    }
}

public int authenticateUser(String user, String pass) {
    User user;
    try {
        PreparedStatement ps = conn.prepareStatement(
            "select readonly * from users where username = \"" + user  + "\" AND " + "password = \"" + pass + "\"");
            ResultSet result = ps.executeQuery();
            while (result.next()) {
                user = new User(result.getString(1), result.getString(2));
            }
            result.close();
            ps.close();
        } catch (SQLException sqle) {
            //do stuff on fail
        }
        return user;
}

}

どんな助けでも大歓迎です。

よろしく、

グリン

こんにちは。

ご協力いただきありがとうございます。これらのチュートリアルが完璧ではないことを示しています。この変更を行ったところ、authenticateUser 内でエラーが発生しました。

while (result.next()) {
user = new User(result.getString(1), result.getString(2));
}

「コンストラクタ User(String, String) は未定義です」の。

ありがとう、

グリン

こんにちは。

大変お世話になりました。「}」がいくつか抜けていたと思うので、以下のように修正しました。

また、「User user = null; //例外ハンドラで何かをしない限り必要」と言います。これについての私の印象は、ユーザーがテーブルに含まれているかどうかを確認し、そうでない場合は例外を返そうとしていることです (つまり、ユーザー名とパスワードを確認します)。したがって、リターンは確認である必要があるため、例外ハンドラーで何かを行っています。明らかに何かが欠けています。では、ユーザーが正常にログインしたことをどのように知るのでしょうか?

また、Eclipse では、パッケージの大文字と小文字が混在していても問題はないようです。これは段階的に行っており、これを追加するためにすべてが機能しているためです。

よろしく、

グリン

package org.AwardTracker.server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import org.AwardTracker.client.DBConnection;
import org.AwardTracker.client.User;

public class MySQLConnection extends RemoteServiceServlet implements DBConnection {
    private Connection conn = null;
private String status;
private String url = "jbdc:mysql://localhost/awardtracker";
private String user = "DBuser";
private String pass = "DBpass";
public MySQLConnection() {
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        conn = DriverManager.getConnection(url, user, pass);
    } catch (Exception e) {
        //NEVER catch exceptions like this
    }
}

public User authenticateUser(String userName, String pass) {
    User user = null; // necessary unless you do something in the exception handler
    ResultSet result = null;
    PreparedStatement ps = null;
    try {
      ps = conn.prepareStatement(
          "select readonly * from users where username = \"" + userName  + "\" AND "    + "password = \"" + pass + "\"");
      result = ps.executeQuery();
      while (result.next()) {
         user = new User(result.getString(1), result.getString(2));
      }
    } 
    catch (SQLException sqle) {
      //do stuff on fail
    }
    finally {
        if (result != null) {
            try {
                result.close();
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            }   
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
return user;
}
}
4

1 に答える 1

0

メソッドを定義しました

public int authenticateUser(String user, String pass) {

それでもあなたが返すオブジェクトは

User user;

チュートリアルを読むと、メソッドを宣言する必要があるように見えます

public User authenticateUser(String userName, String pass) {
    User user = null; // necessary unless you do something in the exception handler
    ResultSet result = null;
    PreparedStatement ps = null;
    try {
      ps = conn.prepareStatement(
          "select readonly * from users where username = \"" + userName  + "\" AND " + "password = \"" + pass + "\"");
      result = ps.executeQuery();
      while (result.next()) {
         user = new User(result.getString(1), result.getString(2));
      }
    } catch (SQLException sqle) {
      //do stuff on fail
    }finally{
        if (result != null) {
            try {
                result.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
        }
    }
return user;
于 2013-01-18T03:09:59.677 に答える