EJB3-инъекция является пустой в Wicket AuthenticateWebSession - PullRequest
3 голосов
/ 24 февраля 2011

Я использую Wicket + EJB3 в приложении и сталкиваюсь с проблемой, но не могу найти какую-либо связанную тему, поэтому вот она:

Я использую аутентификацию Wicket, и мне нужно использоватьметоды из EJB в переопределенных методах authenticate (...).

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

Мой класс WicketSession выглядит примерно так:

public class WicketSession extends AuthenticatedWebSession {

   @EJB(name = "UserService")
   private UserService userService;

   private User user = null;

   public WicketSession(Request request) {
    super(request);
   }

   @Override
   public boolean authenticate(final String login, final String password) {

      user = userService.findByLoginPwd(login, password);

      return user != null;;
   }

   public User getUser() {
      return user;
   }

   public void setUser(User user) {
      this.user = user;
   }
}

И мой EJB3:

@Remote
public interface UserService {
    public User findByLoginPwd(final String login, final String pwd);
}

@Stateless
public class UserServiceImpl implements UserService {

   public User findByLoginPwd(final String login, final String pwd) {
       [...]
   }
}

Веб-часть с Wicket упакована в войну, деловая частьс EJBs упакован в банку, и затем я прислушиваюсь к развертыванию его на сервере JOnAS.

Любая помощь будет высоко ценится =)

Николас

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

Я почти уверен, что инъекция работает с IComponentInstantiationListener (по крайней мере, так работает версия Spring). Обновление: это происходит, см. этот документ .

Однако Sessions не являются компонентами, поэтому необходим другой механизм.Возможно, есть способ подключить ваш Session в методе Application.newSession()?Вам придется взглянуть на реализацию JavaEEComponentInjector и скопировать то, что он делает при создании сеанса.

2 голосов
/ 24 февраля 2011

Как отметил Шон Патрик Флойд, сеансы не являются компонентами, поэтому автоматическая инъекция, предоставляемая для компонентов Wicket, не применяется.

Распространенная идиома ввода содержимого в некомпонентный компонент - добавить строку

    InjectorHolder.getInjector().inject(this);

конструктору.

Я не использовал это для расширения WicketSession, но я не знаю причины, по которой оно не будет работать.

В JavaEEComponentInjector метод inject почти наверняка выполняет поиск JNDI, и вы можете выполнить поиск JNDI самостоятельно, чтобы получить объект, но это повторное использование существующей инъекции, и если вы решите изменить инжекторы (скажем расширение JavaEEComponentInjector) гарантирует, что вы продолжите использовать ту же инъекцию.

...