2009-05-13 9 views
5

Tengo algunos problemas para acceder a un bean de sesión con estado (SFSB) desde un cliente de aplicación. Estoy usando JBoss 5.0.1.GA. El cliente de la aplicación y los EJB están empaquetados en un EAR que se implementa y tengo otros clientes de aplicaciones que funcionan sin problemas. beans de sesión sin estado hasta ahora, sólo he utilizado (SLSBs), pero en lo que a Unterstand que, las diferencias entre SLSBs y SFSBs no deben afectar a la forma en que se puede acceder desde una aplicación cliente.EJB 3: Acceder a un bean de sesión con estado desde un cliente de aplicación

La estructura de las clases/interfaces:

@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(); 
    } 
} 

El cliente de la aplicación se ejecuta a través de la "appclient-lanzador" como se describe en "How to use an application client in JBoss 5". Hacer la búsqueda de "BBean" funciona bien hasta que se invoque someMethod() en el ABean (local) durante la ejecución de init(). Durante esa llamada, el contenedor arroja una InvalidStateException ("Llamada local: el contexto de seguridad es nulo") (como causa raíz). Cuando cambio el bean con estado a un bean sin estado, todo funciona bien (excepto, por supuesto, que el estado no se conserva). Curiosamente, puedo usar exactamente el mismo SFSB de una aplicación web (en un frijol administrado JSF) bien.

¿Estoy haciendo algo mal? ¿Cómo se supone que debo usar un SFSB desde un cliente de aplicación?

No he encontrado nada útil sobre este problema en particular hasta el momento. La excepción es mencionado en un contexto similar en [#JBAS-4317] Security Context over the invocation, pero teniendo en cuenta que ya se realizó, y se fija en JBoss 5.0.0.Beta3, parece no ser el mismo problema.

Respuesta

1

Aunque todavía me gustaría saber por qué mi configuración original, funciona perfectamente para beans de sesión sin estado, pero no para los beans de sesión con estado, aquí está la solución que encontré:

La aplicación web que también se empaqueta en el EAR realiza su autenticación a través de JAAS. Para esto he configurado un dominio de seguridad en el JBoss login-config.xml, que se ve así:

<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> 

He utilizado este dominio de seguridad en jboss-web.xml de la aplicación web, así como en el Jboss.xml de EJB-project, aunque en realidad solo lo uso en la aplicación web (los EJB son accesibles sin autenticación).

Para resolver el problema de acceso al SFSB, solo tuve que eliminar mi dominio de seguridad del jboss.xml en el proyecto EJB. Esto hace que JBoss use el dominio de seguridad predeterminado que parece hacer lo correcto y mi aplicación cliente finalmente puede acceder y usar el SFSB.

0

El motivo se puede encontrar en el EJB 3.0 Core Specification, sección 12.4. Allí dice

Los métodos del interceptor de devolución de llamada del ciclo de vida se invocan en un contexto de transacción y seguridad no especificado.

HTH,
- martin

+1

información interesante. Sin embargo, no estoy seguro de cómo esto explica el comportamiento, especialmente porque "funciona" en un bean sin estado y el problema solo ocurre cuando uso mi propio dominio de seguridad. De todos modos, como ya no tengo nada que ver con el proyecto y no he hecho ningún desarrollo de Java EE desde entonces, no estoy realmente motivado para descubrir cómo funciona esto realmente. ¡Gracias de cualquier manera! –

Cuestiones relacionadas