我当前的设置是 JBoss 4.2.3.GA 上的 JBoss Seam 2.2。
我有两个像这样的 Bean:
@Name("mailingManager")
@Scope(ScopeType.PAGE)
public class MailingMgr {
private Mailing selectedMailing;
@Observer("mailing.letter.success")
public void recordSuccess(final Object arg) {
if (null != selectedMailing) { // store arg }
}
public void send() {
selectedMailing = new Mailing();
if ('EMAIL' == determineType()) {
EmailSender mailer = (EmailSender) Component.getInstance(EmailSender.class);
mailer.send(getAddresses());
}
// ... more options
}
}
@Name("emailSender")
@Scope(ScopeType.PAGE)
public class EmailSender {
public void send(final Set<String> addresses) {
for (String addr : addresses) {
// ... create a mail
Events.instance().raiseEvent("mailing.letter.success", getGeneratedMail());
}
}
}
问题是 when总是recordSuccess()
被调用。selectedMailing
null
作为一种解决方法,我selectedMailing
在调用任何可能触发我的事件的代码之前手动设置对话上下文,然后在调用之前对我的字段进行注释@In(required=false)
以再次注入它recordSuccess
。但是有没有更优雅的解决方案(保持解耦不变)?为什么不重用调用 bean 来处理事件?