JEE7: Ne EJB et CDI haricots soutien container-managed transactions?
Java EE7 se compose d'une série de "haricot" définitions:
- Géré Haricots 1.0 (JSR 316 /JSR 250)
- L'Injection de dépendance pour Java 1.0 (JSR 330)
- CDI 1.1 (JSR-346)
- JSF Géré Haricots 2.2 (JSR-344)
- EJB 3.2 (JSR-345)
Afin de se débarrasser du chaos dans mon esprit, je les études de plusieurs articles de "quand à utiliser bean de type". L'un des avantages pour EJB semble que ils sont les seuls à soutenir déclarative container-managed transactions (la fameuse transaction annotations). Je ne suis pas sûr, cependant, si cela est correct. Quelqu'un peut-il approuver le présent?
Pendant ce temps, je suis venu avec une simple démo de l'application pour vérifier si c'était vrai. J'ai juste défini un bean CDI (pas un EJB - il n'a pas le niveau de la classe d'annotations) comme suit, basé sur cette extrait de:
public class CdiBean {
@Resource
TransactionSynchronizationRegistry tsr;
@Transactional(Transactional.TxType.REQUIRED)
public boolean isTransactional() {
return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
}
}
Maintenant, le résultat sur GlassFish 4.0 est que cette méthode renvoie en fait vrai, ce qui, d'après mes enquêtes, est ne fonctionne pas comme prévu. Je l'ai fait attendre le conteneur d'ignorer l' @Transactional annotation sur un CDI méthode d'haricot, ou même de lancer une exception. J'utilise un fraîchement installé GlassFish 4 serveur, donc il n'y a pas d'interférences.
Donc ma question est vraiment:
- De haricots qui ne sont en fait de support container-managed transactions?
- Juste pour le plaisir de la curiosité, comment ai-je pu le tester avec une simple démo de l'application si le code ci-dessus est faux?
(BTW: Quelqu'un a décrit un problème similaire ici, mais sa solution ne s'applique pas à mon cas.
OriginalL'auteur SputNick | 2013-07-24
Vous devez vous connecter pour publier un commentaire.
Jusqu'à ce que Java EE 7 seulement EJB transactionnel et le
@Transactional
annotation n'existait pas.Depuis Java EE 7 et JTA 1.2 vous pouvez utiliser transactionnelle de l'intercepteur en CDI avec
@Transactional
annotation.Pour répondre à votre question sur le meilleur type de haricot à utiliser, la réponse est CDI par défaut.
CDI haricots sont plus légers que les EJB et le soutien de beaucoup de fonctionnalité (y compris un EJB) et est activé par défaut (lorsque vous ajoutez
beans.xml
fichier de votre application).Depuis Java EE 6
@Inject
remplacent@EJB
. Même si vous utilisez la télécommande Ejb (fonction n'existant pas en CDI), les meilleures pratiques suggèrent que vous@EJB
une fois à injecter à distance EJB et un CDI producteur de l'exposer en tant que bean CDILa même chose est suggéré de Java EE ressources
Ces producteurs seront utilisés plus tard
EJB continuer à faire sens pour certains services qu'ils comprennent comme JMS ou Asynchrone traitement, mais vous pourrez les utiliser comme bean CDI.
javax.ejb.TransactionAttribute
de l'EJB spec qui fait partie de JEE5+ etjavax.transaction.Transactional
qui a été ajouté dans la nouvelle JTA 1.2 spec qui fait maintenant partie de JEE7. Donc, c'est une super nouvelle! Si je vous suis, à droite, ce qui pourrait alors tuer l'EJB de la couche pour la mi-taille des applications.Encore une autre remarque: le fait d'Avoir transactionnelle attributs des deux JTA et EJB spec est une autre source de confusion SEC violation dans le JEE écosystème, droit? Peut
javax.ejb.TransactionAttribute
maintenant être considérées comme obsolètes, même pour les Ejb?Pas parce que les EJB sont Transactionnelles par défaut (convention over configuration de l'approche) il est donc normal que vous obtenez spécifiques d'annotation. De Plus, vous pouvez faire avancé les transactions des trucs avec les Ejb comme une des transactions imbriquées ou de gérer les transactions XA. Mais rappelez-vous quand vous avez besoin d'EJB il peut (et doit) être toujours bean CDI. Et oui, le CDI peut remplacer EJB pour une application de lumière.
Je vois. Cependant, à mon avis, ils doivent avoir centralisé de toutes les opérations de choses dans la spec JTA, et pas plus EJB spécifiques à la gestion des transactions. Mais arrêtons de discussion ici. Je vous remercie pour vos précisions.
Je dirais que l'utilisation
@Inject
si vous voulez laisser le conteneur automatiquement avec le "normalement limités cycle de vie (tous les mais@Dependent
) d'un@Stateful
EJB et laissez-le conteneur de passer autour de la dynamique de référence pour vous. Sinon, vous pourriez vous retrouver avec illégalement combiné étendues (CDI 1.1, section 3.2) ou essayez de rechercher un@Remote
EJB qui échouera sans le ballonnement hack posté dans la réponse ci-dessus. La recherche d'un EJB? Utiliser @EJB. À l'aide de @Inject n'a de sens que pour @Stateful avec déclarée CDI portée.OriginalL'auteur Antoine Sabot-Durand
La javadoc de Transactionnelles dit:
Vos hypothèses sont fausses. Les ejb, jusqu'à ce que Java EE 6, ont été les seuls types de composants pour prendre en charge déclarative des transactions. Le Transactionnel annotation a précisément été introduites dans Java EE 7 pour les non-EJB, géré CDI haricots transactionnelle.
OriginalL'auteur JB Nizet