Events 在Arquillian中观察到CDI,事件未传播到注入bean

Events 在Arquillian中观察到CDI,事件未传播到注入bean,events,cdi,observer-pattern,weld,jboss-arquillian,Events,Cdi,Observer Pattern,Weld,Jboss Arquillian,使用Arquillian JUnit(版本分别为1.1.1和4.11)设置嵌入JDK 1.7.25的CDI(1.0.0.CR7 on Weld 1.1.13.Final) 获得以下课程: public class Receiver { private String message; public void catching(@Observes DummyEvent event) { System.out.println(String.format("message [%s],

使用Arquillian JUnit(版本分别为1.1.1和4.11)设置嵌入JDK 1.7.25的CDI(1.0.0.CR7 on Weld 1.1.13.Final)

获得以下课程:

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()));
  }
}
我不明白的是,在示例JUnit中,为什么接收器哈希代码不同,事件没有传播到注入的接收器bean。相反,事件被发送到另一个接收方bean


这与作用域(应该是默认的@Dependent)有关吗?

看起来
接收方
发送方
没有定义作用域。因此,它们的作用域将是
@Dependent
。当您使用
@Dependent
时,将在每个注入点注入一个新实例。

尝试使用weld se(使用WeldJUnit4Runner)并获得相同的结果(即,不是Arquillian问题)。将@ApplicationScoped添加到接收器并添加“notifyObserver=接收。如果存在”注释停止事件向“其他”bean的传播。注意,通过非条件观察(receipt.ALWAYS),为每个事件创建一个接收方bean。一点也不像我期望的那样。向接收者添加@Singleton可以提供正确的行为,但不希望仅限于Singleton。有什么想法吗?在依赖项上添加任何作用域都应该对您有用(RequestScope、ApplicationScoped等)。John,是的,除了这个问题外,这个框是一个衍生产品,目标注释类型可能有自己的作用域。据我所知,在同一个托管bean上可以有多个作用域(例如,如果我混合在一个自定义作用域中)。
sender hash [785714873]
firing event [value: Hello from me], hash [785714873]
message [Hello from me], hash [632925108]
message [null], receiver hash: [1085786565]