【问题标题】:MySQLConnection - Error on authenticateUser of "Multiple markers at this line"MySQLConnection - “此行有多个标记”的 authenticateUser 错误
【发布时间】:2013-01-18 02:56:54
【问题描述】:

我正在尝试在 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;
}

}

任何帮助将不胜感激。

问候,

格林

嗨 BenvynQ,

感谢您的帮助。只是表明这些教程并不完美。我做了这个更改,现在在 authenticateUser 中出现错误:

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

关于“构造函数 User(String, String) 未定义”。

谢谢,

格林

嗨,贝文克,

非常感谢您的帮助。我认为缺少一些“}”所以我修改如下。

另外,你说“User user = null; // 必要的,除非你在异常处理程序中做某事 “。我对此的印象是,我们试图找出用户是否在表中,如果不在则返回异常(即验证用户名和密码)。因此,返回需要是确认,因此我们正在使用 exveption 处理程序做一些事情。我显然遗漏了一些东西;那么我们如何知道用户已成功登录?

此外,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;
}
}

【问题讨论】:

  • //NEVER catch exceptions like this... 除非你刚刚抓住它并丢弃它。我认为您的意思是没有 try/catch 块并让异常传播到方法之外。
  • gwt.xml 文件中的 GWT servlet 标记也是老派,如果您可以切换到最新的 GWT 2.5 和基于 annotation/web.xml 的方法。
  • 嗨,SSR,你能指出我应该如何做的例子吗?这将不胜感激。 Regatds,格林

标签: java mysql eclipse gwt


【解决方案1】:

你已经定义了方法

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;

【讨论】:

  • 您好 BenvynQ,感谢您的帮助。只是表明这些教程并不完美。我做了这个更改,现在在 authenticateUser 中出现错误:while (result.next()) { user = new User(result.getString(1), result.getString(2)); } 的“构造函数 User(String, String) 未定义”。谢谢,格林
  • 我已经更新了方法有一些错误。我还注意到您的包名称是混合大小写的。我不知道这是否会混淆 Eclipse,它不应该,但你永远不知道。
  • 嗨 BevynQ,感谢您的帮助;非常感谢,格林。
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多