Получение EJBTransactionRolledbackException при попытке подключения к базе данных MYSQL - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь по функциональности войти в систему с учетными данными из базы данных. До сих пор я только что получил EJBTransactionRolledbackException. Трассировка стека огромна, и до сих пор я не смог найти в Интернете ничего, связанного с моей конкретной проблемой.

Поэтому в базе данных MySQL, которую я настроил, таблицы разбиты на логические данные. У меня есть таблица user_info с memberID, addressID, loginID, firstName, lastName, электронная почта, phoneNumber и isModerator. Моя таблица user_login имеет логин, имя пользователя и пароль. Таблица user_address не обязательна в этой точке программы. Логин из таблицы user_login является внешним ключом в таблице user_info. Поэтому я по сути делаю внутреннее соединение, чтобы получить всю информацию из таблиц ботов, а затем пытаюсь создать новый объект пользователя и вернуть его. Я пытался просто извлечь данные из одной таблицы, но та же проблема сохраняется. Запрос, используемый в коде 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) {// Возвращаем страницу продуктов. return "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: Ошибка вызова EJB прикомпонент UserDataService для метода public beans. Данные пользователя. UserDataService.findEntry (java.lang.String): javax.ejb.EJBTransactionRolledbackException

Остальная часть трассировки стека находится в файле, поскольку я не смог ее вставитьздесь: https://www.dropbox.com/s/r4ampjxr7clfzjz/log.txt?dl=0

Ожидаемый результат состоит в том, что пользователь будет возвращен из метода findEntry, который проверяется в методе validateUser в бизнес-логике, и если он не возвращает ноль, возвращается 0, чтопроверяется в контроллере входа, который должен войти в систему пользователя. Очевидно, что-то не так с откатом базы данных. Я просто не уверен, что это значит или что вызывает это, или как это исправить. Я пропустил какой-либо важный код или XML-файлы?

1 Ответ

1 голос
/ 05 ноября 2019

Вы должны сначала переместить курсор в наборе результатов, это то, о чем говорит сообщение об ошибке " Перед началом набора результатов ".

Так что сначала переместите курсор перед тем, какчтение из него. ResultSet # next () вернет true, если это еще не конец.

if (resultSet.next()){
    currentUser = new User(resultSet.getInt("memberID")...
}
...