Events 在Arquillian中观察到CDI,事件未传播到注入bean
使用Arquillian JUnit(版本分别为1.1.1和4.11)设置嵌入JDK 1.7.25的CDI(1.0.0.CR7 on Weld 1.1.13.Final) 获得以下课程: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],
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]