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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top