Crear el componente EJB personalizado: opción 1

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:
  1. En el proyecto de módulo, expanda Interfaces y seleccione la interfaz WSDL generada para este EJB en WebSphere Studio Application Developer Integration.
  2. 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.
  3. Aparecerá un componente en el diagrama de ensamblaje. Selecciónelo y vaya a la vista Propiedades.
  4. 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.
  5. En la pestaña Detalles verá que este componente tiene una interfaz, la interfaz que arrastró y soltó en el Editor de ensamblaje.
  6. En el editor de ensamblaje, pulse con el botón derecho el componente que acaba de crear y seleccione Generar implementación… > Java 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:
  1. Definiciones relevantes de la interfaz WSDL 5.1
  2. Los métodos Java de WebSphere Studio Application Developer Integration Edition 5.1 correspondientes al WSDL
  3. 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:
  1. 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.
  2. 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.
  3. 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….
  4. 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.
  5. Seleccione la herramienta Conectar en la paleta, en el Editor de ensamblaje.
  6. Pulse el componente Java y suelte el ratón.
  7. A continuación pulse la Importación EJB y suelte el ratón.
  8. 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.
  9. 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.
  10. 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:
  1. Cree una variable privada (cuyo tipo sea el de la interfaz EJB remota):
    private YourEJBInterface ejbService = null;
  2. 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”);
  3. 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:
  1. Convierta todos los parámetros en los tipos de parámetro esperados por el EJB.
  2. Invoque el método adecuado en la referencia EJB utilizando el modelo de programación SCA, enviando los parámetros convertidos.
  3. 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();
}
}

Comentarios
(C) Copyright IBM Corporation 2005, 2006. Reservados todos los derechos.