Исключить / удалить услуги из Dependency Indejection в JBoss - PullRequest
1 голос
/ 21 апреля 2011

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

Краткий пример:

Inу нас есть базовая библиотека:

@Stateless
@Local( IUserService.class ) 
public UserServiceBean implements IUserService {
  public void login(String user, String password) {...}
}

. В приложении нам нужно переопределить login(...), и поэтому мы имеем:

@Stateless
@Local( { ISpecificUserService.class, IUserService.class } ) 
public SpecificUserServiceBean extends UserServiceBean implements ISpecificUserService {
  public void login(String user, String password) { ... } //override
}

Если у меня теперь есть другой EJB-компонент в приложении, которое нуждается вчтобы иметь ссылку на SpecificUserServiceBean я бы сделал @EJB ISpecificUserService userService;.

Однако, если в базовой библиотеке есть EJB, он будет содержать @EJB IUserService userService;, и вот проблема:

Нам нужно получить конкретную службу в приложении, внедренную в базуБиблиотека EJB.Однако есть два EJB, зарегистрированных для одного и того же локального интерфейса, что означает, что контейнер может вернуть базовый EJB или конкретный EJB.

Вы можете сказать: «Не добавляйте jar базовой библиотеки в качестве модуля вapplication.xml ", но сейчас это невозможно, поскольку он содержит другие EJB-компоненты, которые необходимо развернуть.Мы могли бы переместить EJB-объекты для переопределения в другой jar-файл, но так как почти каждый EJB-компонент может быть переопределен, в зависимости от приложения, мы получили бы JAR-файл на EJB-компонент.

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

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

У вас есть идеи о том, что мы могли бы сделать?

Заранее спасибо.

Кстати, мы работаем над JBoss 4.2.3 с EJB 3.0.

1 Ответ

1 голос
/ 21 апреля 2011

Проблема в том, что вы частично подключаете свое приложение к базовой библиотеке, что плохо, поскольку вы не можете переопределить это подключение.

Таким образом, решение состоит в том, чтобы удалить @Stateless @Local( IUserService.class ) из UserServiceBean в вашей базовой lib; базовая библиотека просто предоставляет реализации по умолчанию для bean-компонентов, но она не должна связывать их.

В ваших приложениях вам нужен этот код:

@Stateless
@Local( IUserService.class ) 
public AppUserServiceBean extends UserServiceBean {}

для создания проводки. Переместите все эти bean-компоненты в специальный пакет, который вы можете скопировать в каждое приложение, чтобы получить проводку по умолчанию для всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...