Наблюдение CDI в Arquillian, событие не распространяется на внедренный компонент

Использование Arquillian JUnit (версия 1.1.1 соответственно 4.11) для настройки моего CDI (1.0.0.CR7 на Weld 1.1.13.Final), встроенного в JDK 1.7.25....

Получил следующие классы:

public class Receiver {
  private String message;

  public void catching(@Observes DummyEvent event) {
    System.out.println(String.format("message [%s], hash [%d]", event.getMessage(), hashCode()));
    this.message = event.getMessage();
  }

  public String getMessage() {
    return this.message;
  }
}

public class Sender {
  @Inject @Any
  Event<DummyEvent> e;

  public void fire(String message) {
    System.out.println(String.format("fire message [%s], hash [%d]", message, hashCode()));

    DummyEvent de = new DummyEvent;
    de.setMessage(message);
    e.fire(de);
  }
}

@RunWith(Arquillian.class)
public class Example {
  @Deployment
  public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class).addClasses(Example .class, Receiver.class, Sender.class)
         .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
  }

  @Inject
  Receiver receiver;

  @Inject
  Sender sender;

  @Test
  public void dummy() {
    System.out.println(String.format("sender hash [%d]", sender.hashCode()));
    sender.fire("Hello from me");

    System.out.println(String.format("message [%s], receiver hash: [%d]",
    receiver.getMessage(), receiver.hashCode()));
  }
}

Напечатается следующее:

sender hash [785714873]
firing event [value: Hello from me], hash [785714873]
message [Hello from me], hash [632925108]
message [null], receiver hash: [1085786565]

Чего я не понимаю, так это того, почему хеш-коды получателя различаются, и событие НЕ распространяется на внедренный bean-компонент Receiver в примере JUnit. Скорее событие отправляется в какой-то ДРУГОЙ компонент-получатель.

Это как-то связано с областью действия (которая должна быть @Dependent по умолчанию)?


person Matthew Campbell    schedule 20.12.2013    source источник
comment
Пробовал с помощью сварки (используя WeldJUnit4Runner) и получил те же результаты (т.е. не проблема Arquillian).   -  person Matthew Campbell    schedule 20.12.2013
comment
Добавление @ApplicationScoped к Receiver и добавление notifyObserver=Reception.IF_EXISTS к аннотации Observes останавливает распространение события на ДРУГОЙ bean-компонент. Заметил, что при безусловном наблюдении (Reception.ALWAYS) компонент Receiver создается для каждого события. Совсем не то, что я ожидал.   -  person Matthew Campbell    schedule 20.12.2013
comment
Добавление @Singleton к Receiver дает правильное поведение, но хотелось бы не ограничиваться Singleton. Любые идеи?   -  person Matthew Campbell    schedule 20.12.2013


Ответы (1)


Похоже, что Receiver и Sender не определены. В результате они получат @Dependent в качестве области действия. Когда вы используете @Dependent, новый экземпляр внедряется в каждую точку внедрения.

person John Ament    schedule 20.12.2013
comment
Добавление любой области выше зависимой должно работать на вас (RequestScoped, ApplicationScoped и т. д.). - person John Ament; 06.01.2014
comment
Джон, да-бокс, за исключением того, что этот вопрос является побочным продуктом stackoverflow.com/questions/20050437/, где целевой аннотированный тип, вероятно, имеет свою собственную область. И, насколько я знаю, у вас может быть несколько областей действия на одном и том же управляемом компоненте (например, если я смешал пользовательскую область). - person Matthew Campbell; 07.01.2014