現在の設定は、JBoss4.2.3.GA上のJBossSeam2.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());
}
}
}
問題は、recordSuccess()
が呼び出されたときselectedMailing
は常にであるということですnull
。
selectedMailing
回避策として、イベントをトリガーする可能性のあるコードを呼び出す前に、会話コンテキストで手動で設定し、呼び出される@In(required=false)
前にフィールドに再度挿入するように注釈を付けrecordSuccess
ます。しかし、より洗練された解決策はありますか(デカップリングをそのまま維持する)?また、呼び出し元のBeanがイベントの処理に再利用されないのはなぜですか?