Почему инъекция CDI не работает в одних модулях, но не работает в других? - PullRequest
3 голосов
/ 28 июля 2011

В моем проекте Java EE есть несколько модулей "Java EE" и веб-модуль. Один из модулей Java EE предоставляет класс для CDI, который должен использоваться другими модулями:

@ApplicationScoped
public class XFactory {

  @Produces @Actual
  public X create() {
     return new X();
  }
}

Они вводятся в

   @SessionScoped
   public class Target implements Serializable {
       X x;

      @Inject
      public void setX(@Actual X x){
        this.x = x;
      }
   }

Однако это работает только в одном из модулей Java EE и в веб-модуле. Во всех остальных модулях Java EE инъекция постоянно завершается неудачей, и я не понимаю, почему: все, что я получаю, это WELD-1408, неудовлетворенная зависимость .

Все модули имеют beans.xml в нужных местах, все они работают, пока я не переключаюсь на впрыск. Большинство целевых bean-компонентов уже используются в качестве встроенных bean-компонентов в JSF. Что особенного в работающем модуле Java EE, так это то, что компонент вводится в сервлет в веб-модуле, а не в JSF.

Проект работает с Java EE 6, EJB 3.1 в GlassFish 3.1. Зависимости управляются Maven 3. X Сам по себе Serializable, чтобы удовлетворить пассивирующие области.

Вы сталкивались с этим раньше? Что я мог сделать не так?

Обновление : добавлено замечание по управлению зависимостями выше.

Обновление : исправлено положение @Actual в Target.

Обновление : обновлено описание с более подробной информацией после дня экспериментов.

1 Ответ

1 голос
/ 29 июля 2011

Кажется, это проблема в Glassfish 3.1, в одной из включенных в него библиотек или, возможно, в JDK 6.

Я только что обновил свою систему до Glassfish 3.1.1 и JDK 7, и проблема больше не возникает.

...