Est-il possible de "s'injecter soi-même" un EJB pour appeler des méthodes locales comme méthodes de haricot? Dans certains cas, cela pourrait être favorable, par exemple si des transactions gérées par des conteneurs sont utilisées et que quelque chose devrait être accompli dans une nouvelle transaction.Un bean EJB3 peut-il s'auto-injecter et appeler ses propres méthodes via un conteneur EJB?
Un exemple comment cela pourrait fonctionner:
Foo.java:
@Local
public interface FoO {
public void doSomething();
public void processWithNewTransaction(); // this should actually be private
}
FooBean.java:
@Stateless
public class FooBean implements Foo {
@EJB
private Foo foo;
public void doSomething() {
...
foo.processWithNewTransaction();
...
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void processWithNewTransaction() {
...
}
}
Si j'extrais processWithNewTransaction()
à un autre grain, il aurait besoin d'être exposée comme une méthode publique dans l'interface, même si elle doit être appelée uniquement par FooBean
. (Le même problème concerne mon code ci-dessus, c'est pourquoi il y a un commentaire dans la définition de l'interface.)
Une solution consisterait à basculer vers des transactions gérées par le bean. Cependant, cela nécessiterait de changer le bean entier pour gérer ses propres transactions, et ajouterait beaucoup de plaque de chaudière à toutes les méthodes.
En complément des réponses ci-dessous: Si vous ne voulez pas avoir la méthode avec une nouvelle transaction dans votre interface locale, vous pouvez annoter votre implémentation de haricots à la fois '@Local (Foo.class)' et ' @ LocalBean' et ont la méthode comme méthode publique dans la classe d'implémentation seulement. – Gandalf
OP - Veuillez le mettre à jour pour décocher la réponse sélectionnée qui est incorrecte. – NBW