EJB 3: Accesso a una session bean stateful da un client di applicazione
-
21-08-2019 - |
Domanda
Sto avendo un po 'di problemi ad accedere un bean di sessione stateful (SFSB) da un client di applicazioni. Sto usando JBoss 5.0.1.GA. Il client di applicazione e gli EJB sono entrambi confezionati in un EAR, che distribuisce e non ho altri client di applicazioni che funzionano senza problemi. Finora, ho usato solo bean di sessione senza stato (SLSBs), ma per quanto mi Unterstand esso, le differenze tra SLSBs e SFSB non dovrebbe influenzare il modo in cui si può accedere da un client di applicazione.
La struttura delle classi / interfacce:
@Local public interface A {...}
@Stateless public class ABean implements A {...}
@Remote public interface B {...}
@Stateful public class BBean implements B {
@EJB private A anInstanceOfA;
@PostConstruct private void init() {
this.anInstanceOfA.someMethod();
}
}
Il client di applicazione viene eseguita tramite il "AppClient-launcher", come descritto in "Come utilizzare un client di applicazioni in JBoss 5" . Facendo la ricerca di "BBean" funziona bene fino a quando someMethod () sul (locale) ABean viene chiamato durante l'esecuzione di init (). Durante la chiamata, il contenitore genera un InvalidStateException ( "chiamata locale: contesto di protezione è nullo") (come la causa principale). Quando cambio il fagiolo stateful ad un bean senza stato, tutto funziona bene (tranne, naturalmente, che lo Stato non è conservato). È interessante notare che, posso usare la stessa SFSB da un'applicazione Web (in un JSF managed-bean) più che bene.
Sto facendo qualcosa di sbagliato? Come faccio a utilizzare uno SFSB da un client di applicazione?
Non ho trovato nulla di utile su questo particolare problema finora. L'eccezione è menzionato in un contesto simile a [# JBAS-4317] contesto di protezione sopra l'invocazione , ma considerando che è contrassegnato come fatto ed è fissato in JBoss 5.0.0.Beta3, sembra non essere lo stesso problema.
Soluzione
Anche se mi piace ancora di sapere perché il mio setup originale funziona perfettamente per i bean di sessione senza stato, ma non per session bean stateful, ecco la soluzione che ho trovato:
L'applicazione web che è anche nell'involucro EAR fa sua autenticazione tramite JAAS. Per questo ho configurato un dominio di sicurezza nella JBoss login-config.xml, che assomiglia a questo:
<application-policy name="My-SD">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="unauthenticatedIdentity">guest</module-option>
<module-option name="dsJndiName">java:/myDS</module-option>
<module-option name="principalsQuery">SELECT PASSWORD FROM LOGIN WHERE LOGIN = ? AND STATUS > 0</module-option>
<module-option name="rolesQuery">SELECT ROLE, 'Roles' FROM USER_ROLE WHERE LOGIN = ?</module-option>
</login-module>
</authentication>
</application-policy>
Ho usato questo dominio di protezione in JBoss-web.xml della web-application così come nella jboss.xml del EJB-progetto, anche se io in realtà uso solo nel web-app (gli EJB sono accessibili senza autenticazione ).
Per risolvere il problema con l'accesso alla SFSB, ho dovuto rimuovere il mio dominio di sicurezza dal jboss.xml nel EJB-progetto. Ciò rende quindi JBoss utilizzare il dominio di sicurezza di default che sembra fare la cosa giusta e il mio cliente applicazione finalmente in grado di accedere e utilizzare lo SFSB.
Altri suggerimenti
La ragione può essere trovata nel EJB 3.0 Core Specification , sezione 12.4. Ci si dice
metodi di callback del ciclo di vita intercettori vengono richiamati in un contesto di transazione e la sicurezza non specificato.
hth,
- martin