Разве нельзя реализовать один локальный интерфейс двумя bean-компонентами без сохранения состояния? - PullRequest
4 голосов
/ 16 января 2010

Я получаю следующее исключение, когда Локальный интерфейс реализуется двумя bean-компонентами без сохранения состояния, один из которых имеет нормальную функциональность, а другой имеет некоторую расширенную функциональность.

java.lang.RuntimeException: не удалось разрешить глобальное имя JNDI для @EJB для контейнер UserBean: ссылочный класс: org.app.SecurityServiceLocal ejbLink: дублируется в Some.jar

Ответы [ 2 ]

3 голосов
/ 16 января 2010

Наконец я узнал, почему я получаю это исключение

Я использовал аннотацию @EJB для внедрения bean-компонента без состояния в другой bean-компонент с именем без имени UserBean со следующим кодом

@Stateless(name="UserBean")
@EJB(name="app/SecurityService",
        beanInterface=SecurityServiceLocal.class)
public class UserBean implements UserRemote{

}

Если вы проверяете детали внедрения, я внедрял SecurityServiceLocal, который был реализован двумя классами bean-классов без сохранения состояния с именем SercurityServiceBean и SecurityServiceEnhaBean. Таким образом, контейнер находится в состоянии неоднозначности, чтобы решить, в какой бин внедрить, так как оба реализуют один и тот же интерфейс.

Эту проблему можно решить, указав дополнительную информацию, например beanName значение свойства в аннотации @EJB. Там вы должны указать, какой класс bean-компонента без сохранения состояния необходимо внедрить, используя имя bean-компонента (объявленное на этом уровне bean (или) в ejb-jar.xml). проверьте код, чтобы определить изменение в отображении впрыска

@Stateless(name="UserBean")
@EJB(name="app/SecurityService",
        beanInterface=SecurityServiceLocal.class,
        beanName="SecurityServiceEnha")
public class UserBean implements UserRemote{

}
0 голосов
/ 16 января 2010

Трудно сказать наверняка, не видя код. Хорошим первым шагом будет использование необязательного атрибута mappedName = "" в аннотации ваших сессионных компонентов, чтобы дать каждому уникальное имя JNDI. Вы должны будете использовать эквивалентный атрибут mappedName в своем клиенте, чтобы убедиться, что вы используете бин, который вы намереваетесь.

...