我正在尝试使用数据库中的凭据登录的功能。到目前为止,我刚刚获得了EJBTransactionRolledbackException。堆栈跟踪非常大,到目前为止,我无法在线找到与我的特定问题相关的任何内容。
因此,我设置的MySQL数据库将表分为逻辑数据。我有一个user_info表,其中包含memberID,addressID,loginID,firstName,lastName,email,phoneNumber和isModerator。我的user_login表具有loginID,用户名和密码。程序中此时不需要user_address表。 user_login表中的loginID是user_info表中的外键。因此,我实质上进行了内部联接,以从bot表中获取所有信息,然后尝试创建一个新的用户对象并返回它。我已经尝试过仅从一个表中提取数据,但是同样的问题仍然存在。 Java代码中使用的查询在MySQL工作台中工作正常。
这是有问题的方法,它是findEntry方法:
@Stateless
@Local(DataAccessInterface.class)
@LocalBean
public class UserDataService implements DataAccessInterface<User> {
public UserDataService() {
}
@Override
public List<User> findAll() {
return null;
}
@Override
public User findEntry(String condition) {
String query = "SELECT * FROM user_info INNER JOIN user_login WHERE username='" + condition + "';";
Connection databaseConnection = null;
Statement statement = null;
ResultSet resultSet = null;
User currentUser = null;
try {
databaseConnection = DriverManager.getConnection(url, username, password);
statement = databaseConnection.createStatement();
resultSet = statement.executeQuery(query);
currentUser = new User(resultSet.getInt("memberID"), resultSet.getInt("addressID"), resultSet.getInt("loginID"), resultSet.getString("firstName"), resultSet.getString("lastName"), resultSet.getString("email"), resultSet.getString("phoneNumber"), resultSet.getString("username"), resultSet.getString("password"), resultSet.getInt("isModerator"));
}
catch(SQLException e) {
throw new DatabaseException(e);
}
finally {
try {
if(databaseConnection != null) {
databaseConnection.close();
statement.close();
resultSet.close();
}
}
catch(SQLException e) {
throw new DatabaseException(e);
}
}
return currentUser;
}
这是findEntry的调用位置:
@Stateless
@Local(AccountBusinessInterface.class)
@LocalBean
public class AccountBusiness implements AccountBusinessInterface {
@EJB
private DataAccessInterface<User> userDataService;
public AccountBusiness() {
}
/**
* Validates that the use who entered in their username and password entered the correct information.
*/
@Override
public int validateUser(User user) {
//Sets the login boolean to true.
//user.setLoggedIn(true);
//Sets the login text to logout.
//user.setLoginText("Logout");
User currentUser = userDataService.findEntry(user.getUsername());
if(currentUser != null) {
return 0;
}
return 1;
}
这是登录控制器中的onLogin方法:
@ManagedBean
@ViewScoped
public class LoginController {
/**
* This is the BusinessAccountInferface.
*/
@Inject
private AccountBusinessInterface accountBusinessInterface;
/**
* The default constructor.
*/
public LoginController() {
}
/**
* Takes in a user object and returns the product page that can only be seen by a logged in user, assuming the correct
* username and password was entered.
* @param user
* @return String
*/
public String onLogin(User user) {
//Gets the user object from the appropriate form.
FacesContext.getCurrentInstance()。getExternalContext()。getRequestMap()。put(“ user”,user);
//如果验证失败,则返回错误页面。
if(accountBusinessInterface.validateUser(user)== 0){
//返回产品页面。
返回“ ProductsPage.xhtml”;
}
//Returns the login page by default.
return "Login.xhtml";
}
这是我的自定义例外:
public class DatabaseException extends RuntimeException {
/**
* This is the default serial version id.
*/
private static final long serialVersionUID = 1L;
public DatabaseException() {
printStackTrace();
}
public DatabaseException(SQLException e) {
printMessage(e.getMessage());
}
public DatabaseException(String message) {
printMessage(message);
}
public DatabaseException(SQLException e, String message) {
printMessage(e.getMessage());
printMessage(message);
}
private void printMessage(String message) {
System.err.println(message);
}
}
堆栈跟踪太长,但这是前两行:
19:11:22,668错误[stderr](默认任务18)在开始结果集之前
19:11:22,671错误[org.jboss.as.ejb3.invocation](默认任务18)WFLYEJB0034:方法公共bean的组件UserDataService上的EJB调用失败。 javax.ejb.EJBTransactionRolledbackException
堆栈跟踪的其余部分位于此处的文件中,因为我无法将其粘贴到此处:
https://www.dropbox.com/s/r4ampjxr7clfzjz/log.txt?dl=0
预期结果是将从findEntry方法返回用户,这在业务逻辑上的validateUser方法中进行了检查,如果未返回null,则返回0,这将在登录控制器中检查,该控制器应记录用户显然,正在回滚的数据库有些麻烦。我只是不确定这意味着什么,什么导致了它的发生或如何解决它。我是否遗漏了任何重要的代码或xml文件?
最佳答案
您必须先将光标移动到结果集中,这就是错误消息“开始结果集之前”告诉您的信息。
因此,先移动光标,然后再读取它。如果ResultSet#next()尚未结束,则将返回true。
if (resultSet.next()){
currentUser = new User(resultSet.getInt("memberID")...
}