La técnica de migración recomendada consiste en utilizar el tipo de Importación con enlace de sesión sin estado de
WebSphere
Integration Developer que permite invocar un EJB de sesión sin estado como un componente SCA. Durante la migración, el
código
Java
personalizado debe escribirse para convertirlo entre el estilo de interfaz
Java
SCA y el estilo de interfaz EJB existente.
Para crear el componente EJB personalizado:
- En el proyecto de módulo, expanda
Interfaces y seleccione la interfaz WSDL
generada para este EJB en
WebSphere
Studio Application Developer Integration.
- Arrastre y suelte esta interfaz en el Editor de ensamblaje. Aparecerá un diálogo en el que se
le pedirá que seleccione el tipo de componente a crear. Seleccione Componente sin tipo
de implementación y pulse Aceptar.
- Aparecerá un componente en el diagrama de ensamblaje. Selecciónelo y vaya a la vista
Propiedades.
- En la pestaña Descripción puede cambiar el nombre y el nombre de
visualización del componente por algo más descriptivo. Elija un nombre como el del EJB pero añada un sufijo como por
ejemplo “JavaMed” ya que esto será un componente
Java
que medie entre la interfaz WSDL generada para el EJB en
WebSphere
Studio Application Developer Integration y la interfaz
Java
del EJB.
- En la pestaña Detalles verá que este componente tiene una interfaz, la
interfaz que arrastró y soltó en el Editor de ensamblaje.
- En el editor de
ensamblaje, pulse con el botón derecho el componente que acaba de crear y seleccione
A continuación seleccione el paquete en el que se generará la implementación
Java.
Esto crea un servicio
Java
de esqueleto que se adhiere a la interfaz WSDL de acuerdo con el modelo de programación SCA, en el que los tipos
complejos estás representados por un objeto que es un commonj.sdo.DataObject y los tipos simples están representados
por los equivalentes de objeto
Java.
Los ejemplos de código siguientes muestran:
- Definiciones relevantes de la interfaz WSDL 5.1
- Los métodos
Java
de
WebSphere
Studio Application Developer Integration Edition 5.1 correspondientes al WSDL
- Los métodos
Java
de
WebSphere
Integration Developer 6.0 para el mismo WSDL
El código siguiente muestra las definiciones relevantes de la interfaz WSDL de 5.1:
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified"
elementFormDefault="unqualified"
targetNamespace="http://migr.practice.ibm.com/"
xmlns:xsd1="http://migr.practice.ibm.com/">
<complexType name="StockInfo">
<all>
<element name="index" type="int"/>
<element name="price" type="double"/>
<element name="symbol" nillable="true"
type="string"/>
</all>
</complexType>
</schema>
</types>
<message name="getStockInfoRequest">
<part name="symbol" type="xsd:string"/>
</message>
<message name="getStockInfoResponse">
<part name="result" type="xsd1:StockInfo"/>
</message>
<operation name="getStockInfo" parameterOrder="symbol">
<input message="tns:getStockInfoRequest"
name="getStockInfoRequest"/>
<output message="tns:getStockInfoResponse"
name="getStockInfoResponse"/>
</operation>
El código siguiente muestra los métodos
Java
de
WebSphere
Studio Application Developer Integration Edition 5.1 correspondientes al WSDL:
public StockInfo getStockInfo(String symbol)
{
return new StockInfo();
}
public void setStockPrice(String symbol, float newPrice)
{
// establecer cosas
}
El código siguiente muestra los métodos
Java
de
WebSphere
Integration Developer 6.0 para el mismo WSDL:
public DataObject getStockInfo(String aString) {
//TODO Hay que implementar.
return null;
}
public void setStockPrice(String symbol, Float newPrice) {
//TODO Hay que implementar.
}
También deberá cumplimentar código real cuando vea códigos “//TODO” en la clase de
implementación
Java.
Primero debe crear una referencia de este componente
Java
al EJB real para que pueda acceder al EJB de acuerdo con el modelo de programación SCA:
- Deje el editor de ensamblaje abierto y pase a la perspectiva J2EE. Busque el proyecto EJB que
contiene el EJB para el que está creando un servicio.
- Expanda el elemento
Descriptor de despliegue:
<nombre-proyecto> y busque el EJB. Arrástrelo y suéltelo en el Editor de ensamblaje. Si recibe
un aviso acerca de la necesidad de actualizar las dependencias de proyecto, marque el
recuadro de selección Abrir el editor de dependencias de módulo y
pulse Aceptar.
- Asegúrese de que el proyecto EJB aparece bajo la sección J2EE y si no es así, añádalo
pulsando el botón Añadir….
- Guarde las dependencias de módulo y cierre el editor. Verá que se creó una Importación nueva en
el Editor de ensamblaje. Puede seleccionarlo e ir a la vista Propiedades en la pestaña Descripción
para cambiar el nombre de la importación y el nombre de visualización por algo más significativo. En la pestaña Enlace verá que el tipo de importación se establece automáticamente en
Enlace de bean de sesión sin estado y que el nombre JNDI del EJB ya se ha
establecido adecuadamente.
- Seleccione la herramienta Conectar en la paleta, en el Editor de ensamblaje.
- Pulse el componente Java y suelte el ratón.
- A continuación pulse la Importación EJB y suelte el ratón.
- Cuando se le pregunte Se creará una referencia coincidente en el nodo origen. ¿Desea
continuar?, pulse Aceptar.
Esto crea una conexión entre los dos componentes.
- Seleccione el
componente
Java
en el Editor de ensamblaje y en la vista Propiedades bajo la pestaña Detalles, expanda Referencias y seleccione la
referencia al EJB recién creado. Puede actualizar el nombre de la referencia si el
nombre generado no es muy descriptivo o adecuado. Recuerde el nombre de esta referencia para
utilizarla en el futuro.
- Guarde el diagrama de ensamblaje.
Debe utilizar el modelo de programación SCA para invocar el EJB a partir de la clase
Java
generada.
Abra la clase
Java
generada y siga estos pasos para escribir el código que invocará el servicio EJB. Para la clase de implementación
Java
generada:
- Cree una variable privada (cuyo tipo sea el de la interfaz EJB remota):
private YourEJBInterface ejbService = null;
- Si hay tipos complejos en la interfaz EJB, cree también una variable privada para BOFactory:
private BOFactory boFactory = (BOFactory)
ServiceManager.INSTANCE.locateService(“com/ibm/websphere/bo
/BOFactory”);
- En el constructor de la clase de
implementación
Java,
utilice las API SCA para resolver la referencia EJB (recuerde cumplimentar el nombre de la referencia EJB que anotó en
un paso anterior) y establecer la variable privada igual a esta referencia:
// Buscar el servicio EJB
this.ejbService = (YourEJBInterface)
ServiceManager.INSTANCE.locateService("name-of-your-ejb-reference");
Por cada “//TODO” de la clase de implementación
Java
generada:
- Convierta todos los parámetros en los tipos de parámetro esperados por el EJB.
- Invoque el método adecuado en la referencia EJB utilizando el modelo de programación SCA,
enviando los parámetros convertidos.
- Convierta el valor de retorno del
EJB en el tipo de valor de retorno declarado por el método de implementación
Java
generado
/**
* Método generado para soportar el tipo de puerto WSDL de implementación llamado
* "interface.MyBean".
*/
public BusObjImpl getStockInfo(String aString) {
BusObjImpl boImpl = null;
try {
// invocar el método EJB
StockInfo stockInfo = this.ejbService.getStockInfo(aString);
// formular el objeto de datos SCA para retorno.
boImpl = (BusObjImpl)
this.boFactory.createByClass(StockInfo.class);
// convertir manualmente todos los datos del tipo de retorno EJB en el
// objeto de datos SCA a retornar
boImpl.setInt("index", stockInfo.getIndex());
boImpl.setString("symbol", stockInfo.getSymbol());
boImpl.setDouble("price", stockInfo.getPrice());
} catch (RemoteException e) {
e.printStackTrace();
}
return boImpl;
}
/**
* Método generado para soportar el tipo de puerto WSDL de implementación llamado
* "interface.MyBean".
*/
public void setStockPrice(String symbol, Float newPrice) {
try {
this.ejbService.setStockPrice(symbol, newPrice.floatValue());
} catch (RemoteException e) {
e.printStackTrace();
}
}