Я пытаюсь по функциональности войти в систему с учетными данными из базы данных. До сих пор я только что получил 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-файлы?