Die benutzerdefinierte EJB-Komponente erstellen: Option 1

Die empfohlene Migrationstechnik ist die Verwendung des WebSphere Integration Developer-Imports mit einem Session-Bindingtyp ohne Status, mit dem Sie eine Session-EJB ohne Status als SCA-Komponente aufrufen können. Während der Migration muss benutzerdefinierter Java-Code geschrieben werden, um zwischen dem SCA Java-Schnittstellenstil und dem vorhandenen EJB-Schnittstellenstil zu konvertieren.

So erstellen Sie die benutzerdefinierte EJB-Komponente:
  1. Erweitern Sie im Modulprojekt die Option 'Schnittstellen' und wählen Sie die WSDL-Schnittstelle, die für diese EJB in WebSphere Studio Application Developer Integration generiert wurde.
  2. Ziehen und übergeben Sie diese Schnittstelle an den Assembly-Editor. Es wird ein Dialog angezeigt, der Sie nach dem zu erstellenden Komponententyp fragt. Wählen Sie 'Komponente mit keinem Implementierungstyp' und klicken Sie auf OK.
  3. Eine generische Komponente wird im Assemblydiagramm angezeigt. Markieren Sie sie und gehen Sie zur Ansicht 'Eigenschaften'.
  4. Sie können den Namen und Anzeigenamen der Komponente in einen beschreibenden Namen in der Registerkarte 'Beschreibung' ändern. Wählen Sie einen Namen wie Ihren EJB-Namen, fügen Sie jedoch eine Erweiterung wie “JavaMed” hinzu, da es sich hierbei um eine Java-Komponente handeln wird, die zwischen der WSDL -Schnittstelle, die für EJB in WebSphere Studio Application Developer Integration generiert wurde, und der Java-Schnittstelle des EJB vermittelt.
  5. Auf der Registerkarte 'Details' können Sie sehen, dass diese Komponente über eine Schnittstelle verfügt, nämlich die, die Sie zum Assembly-Editor gezogen und an diesen übergeben haben.
  6. Klicken Sie im Assembly-Editor mit der rechten Maustaste auf die Komponente, die Sie soeben erstellt haben, und wählen Sie 'Implementierung generieren…' > 'Java' Wählen Sie daraufhin das Paket, in dem die Java-Implementierung generiert wird. Dadurch wird ein Java-Gerüstservice erstellt, der sich an die WSDL-Schnittstelle gemäß dem SCA-Programmiermodell hält, in dem komplexe Typen durch ein commonj.sdo.DataObject-Objekt dargestellt werden und einfache Typen durch ihre funktional entsprechenden Java-Objekte.
Die folgenden Code-Beispiele zeigen:
  1. Relevante Definitionen aus der 5.1 WSDL-Schnittstelle
  2. Die WebSphere Studio Application Developer Integration Edition 5.1 Java-Methoden, die der WSDL entsprechen
  3. Die WebSphere Integration Developer 6.0 Java-Methoden für die gleiche WSDL
Der folgenden Code zeigt die relevanten Definitionen aus der 5.1 WSDL-Schnittstelle:
<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>
Der folgende Code zeigt die WebSphere Studio Application Developer Integration Edition 5.1 Java-Methoden, die der WSDL entsprechen:
public StockInfo getStockInfo(String symbol)
{
return new StockInfo();
}
public void setStockPrice(String symbol, float newPrice)
{
		// set some things
}
Der folgende Code zeigt die WebSphere Integration Developer 6.0 Java-Methoden für die gleiche WSDL:
public DataObject getStockInfo(String aString) {
		//TODO Needs to be implemented.
		return null;
}
	public void setStockPrice(String symbol, Float newPrice) {
		//TODO Needs to be implemented.
}
Sie müssen nun echten Code dort eingeben, wo die “//TODO”-Tags in der generierten Java-Implementierungsklasse angezeigt werden. Zunächst müssen Sie einen Verweis von dieser Java-Komponente zur aktuellen EJB erstellen, so dass sie auf die EJB gemäß dem SCA-Programmiermodell zugreifen kann:
  1. Lassen Sie den Assembly-Editor geöffnet und wechseln Sie in die J2EE-Perspektive. Suchen Sie das EJB-Projekt, das die EJB enthält, für die Sie einen Service erstellen.
  2. Erweitern Sie das Element 'Implementierungsdeskriptor: <project-name>' und suchen Sie die EJB. Ziehen und übergeben Sie sie an den Assembly-Editor. Wenn Sie über Projektabhängigkeiten gewarnt werden, die aktualisiert werden müssen, wählen Sie das Kontrollkästchen 'Den Editor für Modulabhängigkeiten öffnen…' und klicken Sie auf OK.
  3. Stellen Sie sicher, dass das EJB-Projekt im J2EE-Abschnitt aufgelistet ist, und wenn dies nicht der Fall ist, fügen Sie es durch Klicken auf die Schaltfläche 'Hinzufügen…' hinzu.
  4. Speichern Sie die Modulabhängigkeiten und schließen Sie den Editor. Sie werden sehen, dass ein neuer Import im Assembly-Editor erstellt wurde. Markieren Sie ihn und gehen Sie zur Ansicht 'Eigenschaften' in der Registerkarte 'Beschreibung', um den Namen und Anzeigenamen des Imports in einen aussagekräftigeren Namen zu ändern. Auf der Registerkarte 'Binding' können Sie sehen, dass der Importtyp normalerweise auf 'Binding für Session-Bean ohne Status' gesetzt ist und der JNDI-Name der EJB bereits ordnungsgemäß eingerichtet ist.
  5. Wählen Sie das Verbindungstool aus der Palette im Assembly-Editor.
  6. Klicken Sie auf die Java-Komponente und lassen Sie die Maustaste los.
  7. Klicken Sie als nächstes auf den EJB-Import und lassen Sie die Maustaste los.
  8. Wenn Sie gefragt werden 'Am Quellenknoten wird ein übereinstimmender Verweis erstellt. Möchten Sie fortfahren?' Klicken Sie auf OK. Dadurch wird eine Verbindung zwischen den zwei Komponenten hergestellt.
  9. Wählen Sie die Java-Komponente im Assembly-Editor und erweitern Sie in der Ansicht 'Eigenschaften' in der Registerkarte 'Details' die Option 'Verweise', und wählen Sie den Verweis zur EJB, die gerade erstellt wurde. Sie können den Namen des Verweises aktualisieren, wenn der generierte Name nicht sehr aussagekräftig oder geeignet ist. Notieren Sie den Namen dieses Verweises für die zukünftige Verwendung.
  10. Speichern Sie das Assembly-Diagramm.
Sie müssen das SCA-Programmiermodell verwenden, um die EJB aus der generierten Java-Klasse aufzurufen. Öffnen Sie die generierte Java-Klasse und befolgen Sie diese Schritte, um den Code für den Aufruf des EJB-Services zu schreiben. Für die generierte Java-Implementierungsklasse:
  1. Erstellen Sie eine private Variable (deren Typ der Ihrer remote EJB-Schnittstelle entspricht):
    private YourEJBInterface ejbService = null;
  2. Wenn komplexe Typen in Ihrer EJB-Schnittstelle vorhanden sind, erstellen Sie außerdem eine private Variable für die BOFactory:
    private BOFactory boFactory = (BOFactory)
    	ServiceManager.INSTANCE.locateService(“com/ibm/websphere/bo
    /BOFactory”);
  3. Verwenden Sie die SCA APIs im Konstruktor der Java-Implementierungsklasse, um den EJB-Verweis aufzulösen (denken Sie daran, den Namen des EJB-Verweises, den Sie ein paar Schritte zuvor notiert haben, einzugeben), und stellen Sie die private Variable gemäß diesem Verweis ein:
    // Locate the EJB service
    	this.ejbService = (YourEJBInterface)
    ServiceManager.INSTANCE.locateService("name-of-your-ejb-reference");
Für jedes “//TODO” in der generierten Java-Implementierungsklasse:
  1. Konvertieren Sie alle Parameter in die Parametertypen, die die EJB erwartet.
  2. Rufen Sie die entsprechende Methode im EJB-Verweis mithilfe des SCA-Programmiermodells auf, und senden Sie die konvertierten Parameter.
  3. Konvertieren Sie den Rückgabewert der EJB in den Rückgabewerttyp, der von der generierten Java-Implementierungsmethode deklariert wird
/**
	 * Method generated to support the implementing WSDL port type named
* "interface.MyBean".
*/
	public BusObjImpl getStockInfo(String aString) {
		BusObjImpl boImpl = null;
try {
			// invoke the EJB method
			StockInfo stockInfo = this.ejbService.getStockInfo(aString);
			// formulate the SCA data object to return.
			boImpl = (BusObjImpl)
					this.boFactory.createByClass(StockInfo.class);
			// manually convert all data from the EJB return type into the
			// SCA data object to return
boImpl.setInt("index", stockInfo.getIndex());
boImpl.setString("symbol", stockInfo.getSymbol());
boImpl.setDouble("price", stockInfo.getPrice());
		} catch (RemoteException e) {
			e.printStackTrace();
}
		return boImpl;
}
/**
	 * Method generated to support the implementing WSDL port type named
* "interface.MyBean".
*/
	public void setStockPrice(String symbol, Float newPrice) {
try {
			this.ejbService.setStockPrice(symbol, newPrice.floatValue());
		} catch (RemoteException e) {
			e.printStackTrace();
}
}

Feedback
(C) Copyright IBM Corporation 2005, 2006. Alle Rechte vorbehalten.