[尝试连接到MYSQL数据库时获取EJBTransactionRolledbackException

问题描述 投票:0回答:1

我正在尝试使用数据库中的凭据登录的功能。到目前为止,我刚刚获得了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调用失败。Userdata.UserDataService.findEntry(java.lang.String ):javax.ejb.EJBTransactionRolledbackException

堆栈跟踪的其余部分位于此处的文件中,因为我无法将其粘贴到此处:https://www.dropbox.com/s/r4ampjxr7clfzjz/log.txt?dl=0

[预期结果是将从findEntry方法返回用户,这在业务逻辑上的validateUser方法中进行了检查,如果未返回null,则返回0,这将在登录控制器中进行检查,该登录控制器应进行日志记录用户。显然,正在回滚的数据库有些麻烦。我只是不确定这意味着什么,什么导致了它的发生或如何解决它。我是否遗漏了任何重要的代码或xml文件?

java mysql jboss ejb
1个回答
0
投票

您必须先将光标移动到结果集中,这是错误消息“ 开始结果集之前”告诉您的内容。

所以先移动光标,然后再读取它。如果尚未在末尾,则ResultSet#next()将返回true。

if (resultSet.next()){
    currentUser = new User(resultSet.getInt("memberID")...
}
© www.soinside.com 2019 - 2024. All rights reserved.