JBoss 6: внедрение EJB в сервлет - PullRequest
3 голосов
/ 26 июля 2011

Народ,

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

У меня есть EJB без состояния, который обнаружен и объявлен в пространстве JNDI:

10:01:53,044 INFO  [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

DTalk/UserManager/local - EJB3.x Default Local Business Interface
DTalk/UserManager/local-com.doctalk.ejb.UserManagerLocal - EJB3.x Local Business Interface

Мне нужно использовать этот EJB в сервлете, который является частью войны, которая является частьюEAR, который содержит EJB.Я хотел бы сделать это с помощью инъекции.

Когда я использую наиболее интуитивную запись:

@EJB
private UserManager userManager;

Я получаю исключение в журналах JBoss.

Когда я используюболее цветочные нотации, такие как:

@EJB( mappedName = "UserManager" )
private UserManager userManager;

или

@EJB( mappedName = "DTalk/UserManager/local" ) // EAR is called DTalk
private UserManager userManager;

Я не получаю ошибок инъекций в jboss, но внедренный бин равен нулю.

Это сводит с ума иогромная трата времени и заставляет меня задаться вопросом, почему я не отказываюсь от франшизы инструментов Eclipse / jboss в пользу NetBeans и GlsssFish.

Любые идеи приветствуются.

Спасибо.

1 Ответ

5 голосов
/ 26 июля 2011

Вы пытаетесь внедрить (прокси) сам экземпляр компонента, а не его интерфейс.

Тем не менее, согласно журналу развертывания, который вы показали, вы объявили, что bean-компонент ограничен в JNDI только через его (локальный) интерфейс.Чтобы сделать внедрение, вы должны либо объявить переменную, в которую вы вводите, как интерфейс:

@EJB
private UserManagerLocal userManager;

ИЛИ объявить, что для вашего компонента должно быть создано представление no-interface:

@Stateless
@LocalBean
public class UserManager implements UserManagerLocal {
    ...
}

, после чего вы можете объявить переменную, как вы делали это ранее:

@EJB
private UserManager userManager;
...