JEE7: czy EJB i CDI Beans obsługują transakcje zarządzane kontenerami?
Java EE7 składa się z kilku definicji "fasolowych":
- Managed Beans 1.0 (JSR-316 / JSR-250)
- Dependency Injection for Java 1.0 (JSR-330)
- CDI 1.1 (JSR-346)
- JSF Managed Beans 2.2 (JSR-344)
- EJB 3.2 (JSR-345)
Tymczasem wymyśliłem prostą aplikację demonstracyjną, aby sprawdzić, czy to prawda. Właśnie zdefiniowałem CDI bean (Nie EJB - nie ma adnotacji na poziomie klasy) w następujący sposób, na podstawie tego fragmentu:
public class CdiBean {
@Resource
TransactionSynchronizationRegistry tsr;
@Transactional(Transactional.TxType.REQUIRED)
public boolean isTransactional() {
return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
}
}
Wynik na GlassFish 4.0 jest taki, że ta metoda zwraca true, co według moich zapytań, na nie działa zgodnie z oczekiwaniami. Spodziewałem się, że kontener zignoruje adnotację @ Transactional w metodzie CDI bean, a nawet wyrzuci wyjątek. Używam świeżo zainstalowanego serwera GlassFish 4, więc nie ma żadnych zakłóceń.
Więc moje pytanie jest naprawdę:
- które typy fasoli obsługują transakcje zarządzane kontenerami?
- tak z ciekawości, jak mógłbym przetestować go za pomocą prostej aplikacji demo, jeśli powyższy kod jest źle?
(BTW: ktoś opisał podobny problem tutaj, ale jego rozwiązanie nie dotyczy mojego przypadku.
2 answers
Do Java EE 7 tylko EJB był transakcyjny, a adnotacja @Transactional
nie istniała.
Od Java EE 7 i JTA 1.2 Można używać transactional interceptor w CDI z adnotacją @Transactional
.
Aby odpowiedzieć na pytanie o najlepszy rodzaj fasoli, odpowiedź jest domyślnie CDI.
CDI beans są lżejsze od EJB i obsługują wiele funkcji (w tym bycie EJB) i są domyślnie aktywowane (po dodaniu pliku beans.xml
do aplikacji).
Ponieważ Java EE 6 @Inject
zastępuje @EJB
. Nawet jeśli używasz zdalnego EJB (funkcja nie istnieje w CDI), najlepsza praktyka sugeruje, aby @EJB
raz wstrzyknąć zdalny EJB i producenta CDI, aby odsłonić go jako CDI bean
public class Resources {
@EJB
@Produces
MyRemoteEJB ejb;
}
To samo jest sugerowane dla zasobów Java EE
public class Resources2 {
@PersistenceContext
@Produces
EntityManager em;
}
Ci producenci będą później używane
public class MyBean {
@Inject
MyRemoteEJB bean;
@Inject
EntityManager em;
}
EJB nadal ma sens dla niektórych usług, takich jak JMS lub asynchroniczne leczenie, ale będziesz ich używać jako CDI bean.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 21:10:16
The javadoc of Transactional says:
Javax.transakcja.Adnotacja transakcyjna zapewnia aplikacji możliwość deklaratywnej kontroli granic transakcji na CDI managed beans, a także klas zdefiniowanych jako managed beans przez specyfikację Java EE, zarówno na poziomie klasy, jak i metody, gdzie adnotacje na poziomie metody zastępują te na poziomie klasy.
Więc twoje założenia są błędne. EJB, aż do Java EE 6, były jedynymi rodzajami komponenty wspierające transakcje deklaratywne. Adnotacja transakcyjna została dokładnie wprowadzona w Java EE 7, aby uczynić transakcyjną nie-EJB, zarządzaną CDI beans.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-24 17:25:10