Ist es möglich, ein EJB "selbst zu injizieren", um lokale Methoden als Bean-Methoden aufzurufen? Es gibt Fälle, in denen dies vorteilhaft sein könnte, beispielsweise wenn Container-verwaltete Transaktionen verwendet werden und etwas in einer neuen Transaktion ausgeführt werden soll.Kann eine EJB3-Bean "selbst injizieren" und ihre eigenen Methoden über EJB-Container aufrufen?
Ein Beispiel, wie dies funktionieren könnte:
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() {
...
}
}
Wenn ich processWithNewTransaction()
zu einem anderen Bohne extrahieren, wäre es müssen als öffentliche Methode in der Schnittstelle ausgesetzt, obwohl es nur von FooBean
aufgerufen werden sollte. (Das gleiche Problem tritt bei meinem obigen Code auf, deshalb gibt es einen Kommentar in der Schnittstellendefinition.)
Eine Lösung wäre, zu Bean-verwalteten Transaktionen zu wechseln. Dies würde jedoch erfordern, die gesamte Bean zu ändern, um ihre eigenen Transaktionen zu verwalten, und würde allen Methoden eine große Kesselplatte hinzufügen.
Als Ergänzung zu den Antworten unten: Wenn Sie nicht die Methode mit neuer Transaktion in Ihrer lokalen Schnittstelle haben wollen, können Sie Ihren Bean Implementierung sowohl mit '@Local (Foo.class) mit Anmerkungen versehen' und ' @ LocalBean' und habe die Methode als öffentliche Methode nur in der Implementierungsklasse. – Gandalf
OP - Bitte aktualisieren Sie dies, um die ausgewählte Antwort zu entfernen, die falsch ist. – NBW