Ich habe eine @RequestScoped-CDI-Bean, die ich in ein EJB verwandeln möchte, um deklarative Transaktionen zu erhalten. (Ich bin auf EJB 3.1, Java EE 6)
Momentan übertrage ich den Status zwischen Subroutinen unter der Annahme, dass die Instanz nur in einer einzigen Anfrage verwendet wird. Wenn ich jetzt @Stateless
hinzufüge, würde sich die Annahme ändern.
Ich möchte zum Beispiel etwas wie
machen %Vor%Ich nehme an, das obige funktioniert nicht - ist das richtig?
Ich denke über zwei Alternativen nach:
EJBContext.getContextData
map verwenden, um Instanzvariablen zu ersetzen. Was ist besser? Und gibt es eine andere Alternative, an die ich nicht denke? (Neben dem Warten auf Java EE 7 oder Wechseln zu Spring.: -))
Während @Stateless
, @Singleton
und @MessageDriven
Bereichsreferenzen haben können, die über @Inject
eingefügt werden, können sie nicht % @RequestScoped
oder einen anderen Bereich sein. Nur das Modell @Stateful
ist flexibel genug, um Bereiche zu unterstützen. Mit anderen Worten, Sie können die @Stateful
-Bohnen-Klasse selbst als @RequestScoped
, @SessionScoped
usw. annotieren.
Vereinfacht ausgedrückt haben @Stateless
, @Singleton
bereits "Bereiche" festgelegt. @Singleton
ist im Wesentlichen @ApplicationScoped
und @Stateless
wäre vielleicht ein erfundener Bereich wie @InvocationScoped
, falls dieser existiert. Der Lebenszyklus einer @MessageDriven
-Bohne hängt vollständig vom Connector ab, der sie steuert, und darf daher auch keinen benutzerdefinierten Bereich haben.
Siehe auch Ссылка
Ich würde mit SFSB anstelle von SLSB gehen. Du willst einen Staat halten, also ist das für mich die wichtigste Information - das ist ein Job für Stateful EJB.
Ich glaube auch nicht, dass EJBContext#getContextData()
dir helfen würde. Soweit ich mich erinnere, ist es nur für eine Dauer eines Anrufs gültig. Daher wird bei jedem Aufruf einer Methode in Ihrem EJB eine neue Kontextdatenzuordnung erstellt (zumindest ist es das, was ich erwarten würde.)
Wenn Sie statusfreie Beans verwenden, sind Sie für jede Statusverwaltung verantwortlich. Normalerweise würden Sie dies in der Web-App-Ebene mithilfe von HttpSessions tun. Und ja, Sie können keine Instanzvariablen verwenden, da statusfreie Beans gepoolt werden.