CDI 1.1: Должен ли @Observed @Initialized(TransactionScoped.class) работать?
CDI 1.1: есть @Observes @Initialized(TransactionScoped.class)
должен работать?
@ApplicationScoped
public class MyClass {
public void processConversationScopedInit(@Observes
@Initialized(TransactionScoped.class) Object payload) {}
public void processConversationScopedDestroyed(@Observes
@Destroyed(TransactionScoped.class) Object payload) {}
}
Это стандартная область в CDI 1.1, но она явно отсутствует в этом списке здесь:
http://www.next-presso.com/2014/06/you-think-you-know-everything-about-cdi-events-think-again/
Я не могу заставить его работать в TomEE 7.0.5/OpenWebBeans, и мне любопытно, если это просто упущение в спецификации. Спасибо!
2 ответа
@TransactionScoped
не является стандартной областью в том смысле, что она не реализована CDI (или, ну, в общем, подразумевает CDI). Это исходит от JTA, и это также имеет свой пакет - javax.transaction
,
При этом, он должен вести себя как все остальные @NormalScope
контексты и, следовательно, должны уволить @Initialized
события для вас, чтобы наблюдать. Хотя обратите внимание, что спецификация CDI только рекомендует это, говоря:
Портативные расширения рекомендуется вызывать событие с квалификатором @Initialized(X.class) при инициализации пользовательского контекста и событие с квалификатором @Destroyed(X.class) при уничтожении пользовательского контекста, где X - связанный тип области действия с контекстом. Подходящая полезная нагрузка события должна быть выбрана.
Я не пробовал это сам, но я бы поспорил, что это работает для большинства современных реализаций. Опять же, вы находитесь в CDI 1.1, который сейчас довольно древний.
Да, так как это не требуется и потенциально добавляет значительные накладные расходы, которых можно избежать, используя уже предоставленное событие области запроса, тогда это не было добавлено в tomee.
Проблема, когда вы начинаете реализовывать что-то из javax.*, Которая не указана, заключается в том, что пользователи будут думать, что это портативно, когда это на самом деле неправильно, поэтому лучше соблюдать спецификацию, когда это возможно, ИМХО.