ejbs (aspectos avanzados) · 2 desarrollando clientes ejb tipos de clientes web server (running...

29
1 EJBs (aspectos avanzados) Mario Muñoz Organero Mario Muñoz Organero Departamento de Ingeniería Telemática http://www.it.uc3m.es/mario Índice del tema Desarrollo de un cliente EJB Desarrollo de un cliente EJB Transacciones EJB Query Language Excepciones en EJBs Seguridad en EJBs Servidores de información 2 Mario Muñoz Organero.

Upload: hoangkhuong

Post on 21-Jan-2019

215 views

Category:

Documents


0 download

TRANSCRIPT

1

EJBs (aspectos avanzados)

Mario Muñoz OrganeroMario Muñoz OrganeroDepartamento de Ingeniería Telemáticahttp://www.it.uc3m.es/mario

Índice del tema

Desarrollo de un cliente EJBDesarrollo de un cliente EJBTransaccionesEJB Query LanguageExcepciones en EJBsSeguridad en EJBs

Servidores de información 2Mario Muñoz Organero.

2

Desarrollando clientes EJB

Tipos de clientes

Web server (running servlets, JSPs)Acts as EJB client EJB server Database/legacy server

RMI/IIOP JDBC

(over

TCP/IP?)

Servidores de información 4Mario Muñoz Organero.

Home userRuns Internet Browser

Bank clerk, running a Java app (usingSwing, etc.) that acts as an EJB client

3

¿Quién puede actuar de cliente de los EJBs?Otros EJBsOtros EJBsServletsAplicaciones Java

Se requiere el arranque de servicios como el JNDI, o un setupcuidadoso (classpath, versión de la JVM, etc.)

Applets JavaSi se dan los permisos apropiados

Servidores de información 5Mario Muñoz Organero.

Si se dan los permisos apropiados

Clientes no JavaLos EJBs son compatibles con CORBA

Comportamiento de un cliente

Servidores de información 6Mario Muñoz Organero.

4

Código de ejemplo. Paso 1: JNDI Lookup

// Obtener un contexto inicial:

Hashtable properties = new Hashtable();

properties.put(INITIAL_CONTEXT_FACTORY,

"com.ibm.websphere.naming.WsnInitialContextFactory");

properties.put(PROVIDER_URL, "iiop://");

InitialContext iCtx = new InitialContext(properties);

// o mediante la propiedad java.naming.factory.initial

Servidores de información 7Mario Muñoz Organero.

// Lookup, y hacer narrow al objecto:

Object homeRef = iCtx.lookup("AccountHome"); //nombre JNDI

AccountHome home = (AccountHome)

PortableRemoteObject.narrow(homeRef,AccountHome.class);

Código de ejemplo. Paso 2: usando el interfaz Home

// Usar la interfaz Home para crear nuevos EJBs:p

Account acc1 = home.create(“Mario", “UC3M");

// O usar los métodos finder para encontrar EJBsexistentes:

Account acc2 = home.findByPrimaryKey(12345);

Collection fatAccounts =

Servidores de información 8Mario Muñoz Organero.

home.findClientsByMinimalBalance(100000);

5

Código de ejemplo. Paso 3: Usando la referencias EJB

// Sencillamente invocar los métodos de negocio:g

acc1.setBalance(acc1.getBalance() - 100);

acc2.setBalance(acc2.getBalance() + 97); // Commisión...

for (Iterator i = facAccounts.iterator(); i.hasNext(); ) {

Account fatAccount = (Account) i.next();

fatAccount.setMaxCredit(1000000);

}

Servidores de información 9Mario Muñoz Organero.

}

Recordar las “Exceptions”...

Los finders pueden lanzar FinderExceptionLos finders pueden lanzar FinderExceptionLos métodos create pueden lanzar CreateExceptionLos métodos de negocio pueden lanzar excepcionesparticularesCualquiera de los métodos puede lanzarRemoteException

Servidores de información 10Mario Muñoz Organero.

Hay que usar pues bloques try/catch

6

El patron de Home Factory

El primer paso en los clientes de EJB es hacer un JNDI lookupp p pUn patrón común: crear una home factoryUso:

ClientHome = (ClientHome)HomeFactory.lookup("JNDI_Name", "ClientHome");

La clase factory proporciona un único método estatico -- lookupHace un narrow de la búsqueda en el JNDI y devuelve un Object alque se le debe hacer un downcast

Servidores de información 11Mario Muñoz Organero.

que se le debe hacer un downcastEl segundo parámetro es el nombre de la clase, usado para elnarrowing

Usando “Class.forName(name)"

Internamente, la factory contiene el objeto InitialContext

Puede también proporcionar un API para obtenerlo

El patrón Session Facade

Usado para minimizar:Usado para minimizar:El acoplamiento entre clientes y Entity beansEl riesgo de que los clientes hagan mal uso de los métodos denegocioRetardos en la redLos puntos de cambio si se modifica la lógica de negocio

La idea: crear un Session EJB que proporciona los

Servidores de información 12Mario Muñoz Organero.

q p pmétodos de acceso para los clientes

Los clientes solo interactúan con los session bean(s)Los Entity EJBs proporcionan (solo) un interfaz local

Los Session EJB acceden a los entity EJBs localmente

7

Otras prácticas recomendadas

Evitar llamar a los métodos de los EJBEvitar llamar a los métodos de los EJBdirectamente desde los JSP

La necesidad de capturar excepciones remotascomplicaría el código JSPUsar wrappers (beans o etiquetas personalizadas)

Evitar “poner a fuego” la “properties JNDI”

Servidores de información 13Mario Muñoz Organero.

p g p pPor ejemplo, guardar los valores de las propiedadesdel hashtable en un fichero

Transacciones

8

¿Qué son las transacciones?

Una transacción es un conjunto de operaciones que cambia unj p qconjunto de datos de forma atómica (consistencia).Conjunto de operaciones indivisible

Agrupación de operaciones sencillasSi una de algo falla se deshace la transacción

Éxito: Se hace un "commit"Fallo: se deshace con un "roll back"

El efecto de la transacción que falla mantiene los datos invariantes

Servidores de información 15Mario Muñoz Organero.

El efecto de la transacción que falla mantiene los datos invariantes.Una transacción exitosa es persistente

Ejemplo: transferencia bancaria

Definiciones

Objeto Transaccional : Un objecto que se usaObjeto Transaccional : Un objecto que se usa(invocación de sus métodos) dentro de unatransacción

Solo se asocia con una transacción a la vezLos EJBs pueden ser objetos transaccionales

Cliente Transaccional : Programa que invocamétodos en objetos transaccionales

Servidores de información 16Mario Muñoz Organero.

métodos en objetos transaccionales.Gestor de Transacciones: Programa quecoordina la realización de la transacción

9

El Contexto de la Transacción

Una sola transacción puede involucrar aUna sola transacción puede involucrar amúltiples objetos y operaciones.Un contexto de transacción representa latransacción compartida por los participantesPor defecto, se propaga automáticamente entreobjetos transaccionales (EJBs)

Servidores de información 17Mario Muñoz Organero.

objetos transaccionales (EJBs).

JTA: el API Java para Transacciones

Servidores de información 18Mario Muñoz Organero.

10

Delimitación de transacciones dentro de los EJBsSi se usa container-managed transaction demarcation (CMT) no hayg ( ) yque programar nadaEl contenedor de EJB gestiona las transacciones automáticamente

Interacción con bases de datosComienzo y fin de transaccionesCreación y propagación del contexto de la transacción.Incluso con two-phase commit (2PC)El programador solo especifica el comportamiento transaccional de los

Servidores de información 19Mario Muñoz Organero.

El programador solo especifica el comportamiento transaccional de losmétodos que desee

No se programa – se edita el deployment descriptor (XML)

Además se soporta: bean-managed transaction demarcation (BMT)y client-managed transaction demarcation.

Valores del atributo de transaccionesCuando se usa CMT los beans (o mejor dichoCuando se usa CMT, los beans (o mejor dicho,los métodos dentro de los beans) tienen un“transaction attribute”Tiene uno de estos 6 valores posibles:

NotSupported

Supports

Servidores de información 20Mario Muñoz Organero.

Supports

Required

RequiresNew

Mandatory

Never

11

Valores : Supports y NotSupportedSupports:Supports:

Si el que invoca el método (cliente, u otro método)tiene un contexto de transacción, se propaga al beanSi no, no se usa un contexto de transacciónSe usa esto para situaciones en las que “da igual”

NotSupported:

Servidores de información 21Mario Muñoz Organero.

pp

Si el que invoca el método tiene un contexto detransacción éste se suspende durante la invocaciónal métodoSi no, no se usa un contexto de transacción

Valores : Required y RequiresNewRequired:Required:

Si el que invoca el método tiene un contexto de transacción sele propaga al beanSi no, el contenedor crea uno nuevoI.e., el método siempre se ejecuta en un contexto detransacción, pero no crea uno si ya existe uno.Este es el valor por defecto

Servidores de información 22Mario Muñoz Organero.

RequiresNew:En cualquier caso se crea un contexto de transacción nuevopara la invocación del métodoSe usa para meter el método en una transacción pero cuandono se quiere que el fallo del método tenga repercusiones fuera.

12

Valores : Mandatory y Never

Mandatory:ySi el que invoca el método tiene un contexto de transacción se lepropaga al beanSi no, se lanza una excepción

TransactionRequiredException oTransactionRequiredLocalException

Se usa cuando se quiere que el invocador tenga un contexto detransacción

Ne er

Servidores de información 23Mario Muñoz Organero.

Never:Si el que invoca el método tiene un contexto de transacción se lanzauna excepción

RemoteException o EJBException

En otro caso el método se ejecuta sin transacciónSe usa para recursos no transaccionales

Ejemplo en el DD<ejb-jar>

…<assembly-descriptor>assembly descriptor<container-transaction>

<method><ejb-name>AccountExpl</ejb-name><method-name>*</method-name>

</method><trans-attribute>Required</trans-attribute>

</container-transaction><container-transaction>

<method>

Servidores de información 24Mario Muñoz Organero.

<ejb-name>AccountImpl</ejb-name><method-name>*</method-name>

</method><trans-attribute>Required</trans-attribute>

</container-transaction></assembly-descriptor>

</ejb-jar>

13

Abortando una Transacción

Con CMT no se pueden crear transaccionesCon CMT no se pueden crear transaccionespero si abortarlas.Si un método de negocio quiere abortar unatransacción debe invocar setRollBackOnlyen su objeto de contexto EJB

Lo que normalmente se hace antes de enviar unaexcepción

Servidores de información 25Mario Muñoz Organero.

excepciónSe usa getRollBackOnly para ver si latransacción ha sido abortada

Transacciones “Bean-Managed”

Solo disponibles para session y message-driven EJBsp p y gUn método de negocio puede usar JTA para crear un objetoUserTransaction y usarlo como su contexto de transacción(ejecutar getUserTransaction() del EJBContext)

Métodos de UserTransaction: begin, commit, rollback,setRollbackOnly

El bean que crea la transacción será el responsable de hacer elcommit o el rollback

Servidores de información 26Mario Muñoz Organero.

En stateless session beans, el método que inicia la transacción debeacabarla

Una instancia que inicia una transacción debe acabarla antes decomenzar otra.

14

La interfaz SessionSynchronizationLos stateful session EJBs (solamente) si usan transacciones( )gestionadas por el contenedor pueden solicitar notificaciones deeventos de transacción

Le permite al bean mantener una caché que podrá sincronizar con unabase de datos

Para ello el bean solo tiene que implementarSessionSynchronization

Hay 3 métodos en la interfaz:

Servidores de información 27Mario Muñoz Organero.

yafterBegin

beforeCompletion

Se puede abortar la transacción con setRollbackOnly en el contexto dela sesión

afterCompleteion(boolean)

El parametro indica commit (true) o rollback

Prácticas recomendadas con transaccionesSe prefiere el control de transacciones por elSe prefiere el control de transacciones por elcontenedorSe prefiere usar Required, RequiresNew yMandatory sobre las otras opciones

Supports, NotSupported y Never no siempre seimplementan

Servidores de información 28Mario Muñoz Organero.

p

15

EJB Query Language

Qué es EJB QL

Un lenguaje de consultas usado con CMPUn lenguaje de consultas usado con CMPPara los métodos “finder”

Tecnicamente, un subconjunto modificado deSQLMás portable que SQL

Soportado por todos los servidores J2EE

Servidores de información 30Mario Muñoz Organero.

Soportado por todos los servidores J2EENormalemente se compila a un lenguaje nativodel servidor de aplicaciones.

16

Una Query EJB QL

EJB QL solo incorpora queries SELECTEJB QL solo incorpora queries SELECTCada query tiene 3 partes:

SELECT

FROM

WHERE (opcional)

La query puede tener parametros

Servidores de información 31Mario Muñoz Organero.

La query puede tener parametrosLos pasados al método “finder”

EJB QL: Ejemplo 1

SELECT DISTINCT Object(c) FROM Customer cSELECT DISTINCT Object(c) FROM Customer c

Encuentra a todos los clientesRetorna una collectionNo retorna duplicados (por el DISTINCT)"Object" es requerido para las variables en la parte del SELECT"Customer c" declara la variable de identificación "c" de tipo"Customer"

Servidores de información 32Mario Muñoz Organero.

17

EJB QL Ejemplo 2

SELECT DISTINCT Object(c) FROM CustomerSELECT DISTINCT Object(c) FROM Customerc, IN (c.accounts) a WHERE a.balance <0.0

Retorna todos los clientes con al menos un descubierto encuenta."IN (c.accounts) a" sigue a la “container-managedrelationship” accounts de los Customer

Servidores de información 33Mario Muñoz Organero.

"WHERE a.balance < 0.0" tiene la misma semántica que enSQL WHERE limitando los resultados devueltos

EJB QL Ejemplo 3

SELECT DISTINCT Object(c) FROM Customer cSELECT DISTINCT Object(c) FROM Customer cWHERE (c.address.country = ?1) AND(c.address.city = ?2)

Esta query acepta 2 parámetrosAparecen como "?1" y "?2" en el código

Se pueden usar para implementar un método finder con 2argumentos

Servidores de información 34Mario Muñoz Organero.

Retorna los clientes de un determinado pais y ciudad

18

Ejemplo DD<entity>

<description>Una descripción</description><ejb-name>AccountImpl2</ejb-name><home>eb.AccountHome</home>home eb.AccountHome /home<remote>eb.Account</remote><ejb-class>eb.AccountImpl2Bean</ejb-class><persistence-type>Container</persistence-type><prim-key-class>java.lang.Integer</prim-key-class><reentrant>False</reentrant><cmp-field>

<field-name>accno</field-name></cmp-field><cmp-field>

<field-name>customer</field-name></cmp-field><primkey-field>accno</primkey-field>

Servidores de información 35Mario Muñoz Organero.

<query><query-method>

<method-name>findByNumber</method-name><method-params>

<method-param>int</method-param></method-params>

</query-method><ejb-ql>SELECT OBJECT(o) FROM accountsample o WHERE o.accno = ?1</ejb-ql>

</query></entity>

Métodos Select

Son similares a los finders:Son similares a los finders:En la clase del entity bean, deben empezar con "ejbSelect"En CMP entity beans, se definen abstractos

Y se proporcionan las secuencias EJB QL en el deploymentdescriptor

En BMP entity beans, se implementan manualmenteRetornan interfaces de componente del bean o una collection

Servidores de información 36Mario Muñoz Organero.

Al contrario que los finders, los métodos select no sereflejan en la interfaz Home

Son para el propio uso del bean

19

Excepciones en los EJBs

Tipos de excepciones

En J2SE hay 2 tipos de excepciones:En J2SE hay 2 tipos de excepciones:Runtime exceptionChecked exceptions

Para los EJBs se suele hacer otra distinción:Application exceptions

Relacionadas con la lógica de negocio

Servidores de información 38Mario Muñoz Organero.

Relacionadas con la lógica de negocio

System exceptionsQue representan problemas en la ejecución del sistema

20

Excepciones de aplicación

Excepciones para reportar problemas en la ejecución deExcepciones para reportar problemas en la ejecución dela lógica de negocio

e.g., public void withdraw(float amount) throwsOverdraftException

Es tarea del cliente recuperar o reportar estaexcepciones.

“El cliente" aquí no significa la aplicación cliente sino cualquiera

Servidores de información 39Mario Muñoz Organero.

q g p qque haya realizado la invocación del método del EJB que lanzala excepción.

La excepciones de aplicación tienen que ser subclasesde Exception, pero no subclases deRuntimeException (i.e., deben ser “checked”)

Excepciones de aplicación (cont.)

Si se lanza una excepción de aplicación y no seSi se lanza una excepción de aplicación, y no secaptura en el servidor, se manda al cliente

Como ocurre con RMI “regular”, el clientesencillamente invoca el método y obtiene unaexcepción como resultado (de forma transparente).

Servidores de información 40Mario Muñoz Organero.

CreateException, FinderException yRemoveException son ejemplos deexcepciones de aplicación.

21

Excepciones de sistema

Usadas para reportar problemas a nivel de sistemaUsadas para reportar problemas a nivel de sistemaFallo al buscar el contexto JNDIFallo al obtener una conexión a una base de datosProblemas de comunicación... etc.

Los clientes no capturan estas excepcionesSi ocurre una excepción de sistema el bean debería:

Servidores de información 41Mario Muñoz Organero.

Si ocurre una excepción de sistema el bean debería:Si son “Runtime exceptions”: propagar la excepción alcontenedorTodas las otras clases: envolverlas en una nuevaEJBException y relanzarlas

El patrón "Generic Application Exception"Un patrón común sugiere definir una superclase para todas la excepcionesp g p p pde aplicación

"MyAppException" o como se quieraTodos los métodos de negocio deben ser declarados como "throwsMyAppException" en la clase bean y en la interfaz de componente

Incluso si no van a lanzar excepcionesDe esta manera, los clientes tienen que meter la llamada a los métodos denegocio en un bloque try/catch

Si los beans evolucionan y lanzan nuevas excepción el código de cliente ya está

Servidores de información 42Mario Muñoz Organero.

Si los beans evolucionan y lanzan nuevas excepción el código de cliente ya estápreparado con su bloque try/catch

Aunque se añadirá la parte necesaria para tratar la nueva excepción

En la práctica, hace que las excepciones de aplicación se traten comoexcepciones en tiempo de ejecución.

22

Seguridad en EJBs

Objetivos de seguridad

La portabilidad no se debe ver afectadapTransparencia, Aislamiento y Abstracción

Los desarrolladores de los beans no tienen por qué conocer nada sobrela seguridadLos desarrolladores de aplicaciones pueden manejar la seguridad sinmodificar el código de los beans

ExtensibilidadFlexibilidad

Servidores de información 44Mario Muñoz Organero.

FlexibilidadLos mecanismos de seguridad no deben imponer políticas de seguridad

Independencia de implementaciónInteroperabilidad

Entre servidores, entre vendedores …

23

Terminología de seguridad en J2EEUn principal es todo aquello que puede ser autenticadop p q q p

Por ejemplo un usuario o un servidorCada principal tiene asociados unos atributos de seguridad (securityattributes)

Usados para saber a qué recursos puede acceder el principalUn principal se identifica presentando credenciales (credentials)

Una credencial contiene o referencia atributos de seguridadLas credenciales se adquieren por autenticación

Servidores de información 45Mario Muñoz Organero.

Las credenciales se adquieren por autenticaciónLas credenciales también pueden ser adquiridas por delegación de otroprincipal.

Seguridad “Container-Based”

La seguiridad para los componentes (EJBs) se proporciona por elg p p ( ) p p pcontenedor en el que se ejecutan.Seguridad declarativa: definida en los “deployment descriptors”

Incluye la definición de roles de seguridad, reglas de control de accesoy requisitos de autenticación.Se mapean por el desarrollador de la aplicación a un entorno deejecución concreto

Seguridad programática: Uso explícito de los APIs de seguridad por

Servidores de información 46Mario Muñoz Organero.

parte del código de los componentesProporciona flexibilidad

e.g., el mismo método puede comportarse de forma distinta en función delprincipal

Principales métodos: getCallerPrincipal y isCallerInRole,definidos en EJBContext.

24

Autenticación en J2EE

J2EE no dicta un método de autenticaciónJ2EE no dicta un método de autenticaciónCada implementación debe proporcionar susherramientas de autenticaciónSoluciones típicas lo hacen por HTTP, HTTPS (HTTPsobre SSL), y basadas en formulariosTambién hay soluciones de autenticación no basadas enW b

Servidores de información 47Mario Muñoz Organero.

WebUna implementación podría por ejemplo basarse en lasherramientas del sistema operativo

e.g., login en Unix o WinNT

Responsabilidades en la seguridad de los EJB

Servidores de información 48Mario Muñoz Organero.

25

Responsabilidades en la seguridad de los EJB

Servidores de información 49Mario Muñoz Organero.

El papel del proveedor del Bean

Los mecanismos de seguridad no deberían ser implementadosg pdentro de los EJBsLas políticas de seguridad no deberían estar codificadas “a fuego”

La misma aplicación, cuando se despliega sobre diferentes entornospuede requerir diferentes políticas.

Conclusión: El proveedor de un bean no debería involucrarse en laseguridad.El proveedor del bean se debería limitar a ofrecer referencias a

Servidores de información 50Mario Muñoz Organero.

El proveedor del bean se debería limitar a ofrecer referencias aroles para la provisión de seguridad (e.g., que roles se asumendefinidos) a través de los descriptores de despliegue

26

APIs disponibles para el proveedor del BeangetCallerPrincipal retorna el “nombre” del principalg p p p

Util para generar logs por ejemplo, o como base para el acceso a unabase de datos…No se debería asumir la existencia de ciertos nombres.

i.e., evitar código como if (principal.equals("root")) ...

isCallerInRole(String roleName) premite al proveedor delbean codificar comportamientos distintos para un mismo método enfunción del role de seguridad del principal.

Servidores de información 51Mario Muñoz Organero.

Es mejor proporcionar diferentes métodos y usar las declaraciones enel descriptor de despliegue para especificar si un role puede o noacceder al método.

Referencias a Roles

El proveedor del bean no puede asumir la existencia de rolesp p“estandar” (e.g., "superusuario", "administrador", etc.)Por lo tanto, el proveedor del bean usará referencias a roles

La definición aparece en el descriptor de despliegue (dentro de ladescripción del bean)Por ejemplo:<security-role-ref>

<description>Security role for customers</description>

l / l f

Servidores de información 52Mario Muñoz Organero.

<role-name>customer</role-ref>

<role-link> Nombre del role en el contenedor </role-link>

</security-role-ref>

Las referencias son mapeadas a los roles disponibles por elensamblador de la aplicación.

27

El ensamblador de la aplicación

Encargado de añadir el assembly-descriptor alEncargado de añadir el assembly descriptor aldescriptor de despliegue.Define los roles de seguridad

A veces es la misma persona que el proveedor del bean

Mapea roles de seguiridad con referencias a roles(definidos por el proveedor del bean)E ifi l i d l ti b l

Servidores de información 53Mario Muñoz Organero.

Especifica los permisos que cada role tiene sobre losmétodos de los EJBs

A veces se deja esta misión al encargado de desplegarla aplicación.

Roles de seguridad

En el DD:En el DD:

<assembly-descriptor><!-- Identifies those security roles defined for an EJB module.--><security-role><!-- Describes a security role. --><description> Administrator role for bean. </description><!-- Identifies a logical role name that this EJB module uses. --><role-name> Nombre del role en el contenedor </role-name>

Servidores de información 54Mario Muñoz Organero.

</security-role></assembly-descriptor>

28

Permisos de los métodos.

El que ensambla la aplicación (o el que la despliega) puede especificar quéét d d i d é lmétodos pueden ser invocados por qué roles.

Por ejemplo (dentro del assembly-descriptor):

<method-permissions><role-name>client</role-name><method>

<ejb-name>Account</ejb-name><method-name>getBalance</method-name>

</method>... more methods ...

</method-permissions>

Servidores de información 55Mario Muñoz Organero.

</method permissions><method-permissions>

<role-name>clerk</role-name><method>

<ejb-name>Account</ejb-name><method-name>*</method-name>

</method>

</method-permissions>

Asociando roles con principales

El que despliega la aplicación usará unaEl que despliega la aplicación usará unasemántica propia del contenedor.Por ejemplo, en WebLogic se tiene en el ficheroweblogic.xml algo así:

<security-role-assignment>l ll d i / l

Servidores de información 56Mario Muñoz Organero.

<role-name>PayrollAdmin</role-name><principal-name>Tanya</principal-name><principal-name>Fred</principal-name><principal-name>system</principal-name>

</security-role-assignment>

29

Identidades de seguridad

Cuando se invoca un método de un EJB se hace usandoCuando se invoca un método de un EJB se hace usandouna identidad de seguridad

Un principal y uno o más roles

Normalmente, cuando un método de un EJB m1 invocaotro método m2, m2 se invoca con la misma identidadSi embargo, se puede especificar que un método seinvoca siempre con una identidad determinada

Servidores de información 57Mario Muñoz Organero.

invoca siempre con una identidad determinadaSolo aplica a llamadas entre métodos de un bean