5 Stimmen

EJB 3: Zugriff auf ein Stateful Session Bean von einem Anwendungsclient

Ich habe Schwierigkeiten, auf ein zustandsbehaftetes Session Bean (SFSB) von einem Anwendungsclient aus zuzugreifen. Ich verwende JBoss 5.0.1.GA. Der Anwendungsclient und die EJBs sind beide in einem EAR verpackt, das bereitgestellt wird, und ich habe andere Anwendungsclients, die ohne Probleme funktionieren. Bisher habe ich nur zustandslose Session Beans (SLSBs) verwendet, aber soweit ich verstehe, sollten die Unterschiede zwischen SLSBs und SFSBs nicht beeinflussen, wie sie von einem Anwendungsclient aus zugegriffen werden können.

Die Struktur der Klassen/Interfaces:

@Local public interface A {...}

@Stateless public class ABean implementiert A {...}

@Remote public interface B {...}

@Stateful public class BBean implementiert B {
    @EJB private A eineInstanzVonA;

    @PostConstruct private void init() {
        dieseInstanzVonA.eineMethode();
    }
}

Der Anwendungsclient wird über den "appclient-launcher" ausgeführt, wie in "Wie man einen Anwendungsclient in JBoss 5 verwendet" beschrieben. Das Suchen nach "BBean" funktioniert gut, bis während der Ausführung von init() someMethod() auf dem (lokalen) ABean aufgerufen wird. Während dieses Aufrufs wirft der Container eine InvalidStateException("Lokaler Aufruf: Sicherheitskontext ist null") (als Wurzelursache). Wenn ich das zustandsbehaftete Bean in ein zustandsloses Bean ändere, funktioniert alles gut (außer natürlich, dass der Zustand nicht erhalten bleibt). Interessanterweise kann ich dasselbe SFSB aus einer Webanwendung (in einem JSF-Managed-Bean) problemlos verwenden.

Mache ich etwas falsch? Wie soll ich ein SFSB von einem Anwendungsclient aus verwenden?

Bisher habe ich noch nichts Nützliches zu diesem speziellen Problem gefunden. Die Ausnahme wird in einem ähnlichen Kontext in [#JBAS-4317] Sicherheitskontext über den Aufruf erwähnt, aber da sie als erledigt markiert ist und in JBoss 5.0.0.Beta3 behoben ist, scheint es nicht das gleiche Problem zu sein.

1voto

Simon Lehmann Punkte 10334

Auch wenn ich immer noch gerne wissen würde, warum mein Originalsetup perfekt für zustandslose Session Beans funktioniert, aber nicht für zustandsbehaftete Session Beans, hier ist die Lösung, die ich gefunden habe:

Die Webanwendung, die ebenfalls im EAR gepackt ist, authentifiziert sich über JAAS. Dafür habe ich in der JBoss login-config.xml ein Sicherheitsdomäne konfiguriert, das wie folgt aussieht:

            gast
            java:/myDS
            SELECT PASSWORD FROM LOGIN WHERE LOGIN = ? AND STATUS > 0
            SELECT ROLE, 'Rollen' FROM USER_ROLE WHERE LOGIN = ?

Ich habe diese Sicherheitsdomäne sowohl in der jboss-web.xml der Webanwendung als auch in der jboss.xml des EJB-Projekts verwendet, obwohl ich sie tatsächlich nur in der Webanwendung verwende (die EJBs sind ohne Authentifizierung zugänglich).

Um das Problem mit dem Zugriff auf die SFSB zu lösen, musste ich einfach meine Sicherheitsdomäne aus der jboss.xml im EJB-Projekt entfernen. Dadurch benutzt JBoss standardmäßig die richtige Sicherheitsdomäne und mein Anwendungsclient kann schließlich auf die SFSB zugreifen und sie nutzen.

0voto

Martin Höller Punkte 2562

Der Grund kann in der EJB 3.0 Core Specification, Abschnitt 12.4 gefunden werden. Dort steht:

Lifecycle-Callback-Interceptor-Methoden werden in einem nicht festgelegten Transaktions- und Sicherheitskontext aufgerufen.

Viele Grüße,
- Martin

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X