Как вызвать конструктор EJB 3.1 с ненулевыми аргументами из сервлета?

У меня есть сервлет login.java, и, как следует из его названия, он предоставляет средства входа в систему для моего веб-приложения.

Я новичок и использую EJB 3.1 и EE 6. В моем EBJ LoginBean.java у меня есть конструктор без аргументов и еще один с некоторыми параметрами (адрес электронной почты, пароль и т. д.).

В определенный момент в коде сервлета у меня есть вызов для создания экземпляра моего EJB:

@EJB LoginBean loginBean;

Я хотел бы знать, возможно ли (и как) вызвать другой конструктор вместо конструктора без аргументов.

Большое спасибо. Ваше здоровье.


person LucasM    schedule 16.03.2011    source источник


Ответы (2)


Вы не хотите этого делать. Один и тот же сервлет является общим для всех пользователей, поэтому EJB также является общим для всех пользователей. Вы не хотите хранить пользовательские данные как переменную экземпляра сервлета или класса EJB. Он будет доступен всем посетителям веб-страницы.

Вместо этого переместите аргументы в метод EJB, который вы вызываете в методе doPost() сервлета входа в систему.

User user = loginBean.login(username, password);

а затем сохранить это в сеансе HTTP, когда он прошел успешно

request.getSession().setAttribute("user", user);

так что остальная часть вашего веб-приложения может перехватить это, чтобы определить, вошел ли пользователь в систему или нет.

if (request.getSession().getAttribute("user") != null) {
    // User is logged in.
} else {
    // User is not logged in.
}
person BalusC    schedule 16.03.2011
comment
Я понял. На самом деле я немного запутался в рабочем процессе сервлетов и EJB. Теперь ясно. Спасибо еще раз. - person LucasM; 19.03.2011

Я на 100% согласен с BalusC. В дополнение к его ответу я хотел бы добавить, что вы обычно* никогда явно не ссылаетесь на конструктор EJB-бина, даже если это теоретически имеет смысл (например, при передаче некоторых зависимостей или некоторой конфигурации параметр).

Компоненты EJB являются управляемыми объектами, и то, что вы получаете в своем аннотированном поле @EJB, является не фактическим объектом, а stub (прокси). Фактический экземпляр объекта, на который указывает заглушка, скорее всего, создается задолго до того, как вы получите эту заглушку, а также, скорее всего, происходит из пула.

(*)Некоторые виды модульных тестов могут быть исключением из этого правила.

person Arjan Tijms    schedule 17.03.2011
comment
Да, теперь понятно. Я действительно знаю, что мы на самом деле не обращаемся напрямую к EJB, а вместо этого получаем доступ к его заглушке (на локальной стороне). Я также читал кое-что о заглушках, скелетонах, RemoteObject (и некоторых других фреймворках, связанных с EE ‹ 5). Полезно понимать, как выполняется внедрение кода с помощью аннотаций. Спасибо! - person LucasM; 19.03.2011