2014-02-15 4 views
2

Я читаю EJB specification и я запуталась противоречием с моей точки зрения, в частности, в отношении на пути к Container ведет себя, когда System Exception брошено в методе жизненного цикла обратного вызова Singleton Bean.System Исключение в Singleton EJB

Раздел 12.3.1:

Исключение времени выполнения выброшен любым жизненным циклом перехватчик обратного вызова метод вызывает экземпляр компонента и его перехватчики быть отброшены после перехватчик цепи unwindsce и любого связанного с ним перехватчик экземпляров отбрасываются (за исключением Singleton Beans).

Раздел 4.8.4:

Ошибки, возникающие во время инициализации Singleton считаются фатальными и должны привести к откладки экземпляра Singleton. Возможные ошибки инициализации включают в себя отказ от инъекции, системное исключение , выведенное из метода PostConstruct, или отказ метода транзакции PostConstruct для успешного совершения транзакции.

В отличие от экземпляров других типов компонентов системные исключения, вызванные из бизнес-методов или обратных вызовов Singleton, не приводят к уничтожению экземпляра Singleton .

Итак, что верно в соответствии с разделом 4.8.4? Если System Exception выбрасывается в метод @PostConstruct или метод Interceptor@PostConstruct - это Bean отбрасывается? Я пробовал это, выбрасывая EJBException, и результатом было то, что инициализация Beans завершилась неудачно.

Еще более удивительным является тот факт, что, когда бросали EJBException из Singleton BeanБизнес Метод, клиент получил Exception и никакой другой метод не был дополнительно выполнен. Можно ли предположить, что экземпляр Bean был отброшен? В соответствии с Спецификацией, которая не должна приводить к уничтожению Bean Instance. Что верно в обоих случаях?

+0

, пожалуйста, предоставьте некоторый код того, что вы тестируете, надеюсь, с комментариями о том, что вы ожидаете, и какие AS вы используете (только для целей тестирования)? – Sergio

+0

Я могу опубликовать некоторый код (как только я снова получаю доступ к моей среде Java EE), но тема довольно теоретическая.Я хочу знать, является ли системное исключение в методе @PostConstruct в компоненте Singleton Bean причиной dirscarding Bean контейнером. Именно этот случай описан в двух «цитатах», приведенных в моем вопросе, и, с моей точки зрения, они противоречат друг другу. – arjacsoh

ответ

1

Я просил код, потому что, возможно, ошибка поставщика. Так же, как вы читаете, если в время @PostContruct существует EjbException, синглтон не создан. После этого метод singleton может вызывать anykind исключения (отмечен или не отмечен), и экземпляр должен быть все еще запущен.

Жизненный цикл перехватчика привязан к жизненному циклу singleton, поэтому, если перехватчик перехватчика выполнил свой @PostContruct, одноэлемент не будет создан.

Другое, что нужно помнить: если EJB (@Stateless или @Stateful) генерирует исключение EjbException (или его перехватчики), автоматически экземпляр отбрасывается, из-за этого в спецификации указано примечание : [58] Except for singletons. See Section 4.8.4

+0

Именно то, что вы указали в своем ответе, я верил, но, прочитав несколько разделов спецификаций, я начал сомневаться. Возможно, неразрушение Singleton системным исключением в методе обратного вызова жизненного цикла применяется не к методу PostConstruct, а к @PreDestroy. – arjacsoh

+0

Если '@ PostConstruct' выдает исключение runtimeException, singleton не будет создан. Кроме того, '@ PostContruct' запускается только один раз в жизненном цикле ejb. – Sergio

Смежные вопросы