Création du composant EJB personnalisé : première option

La technique de migration recommandée consiste à utiliser le type d'importation avec liaison de session sans état de WebSphere Integration Developer qui vous permet d'appeler un EJB de session sans état en tant que composant SCA. Pendant la migration, vous devez écrire du code Java personnalisé pour la conversion entre le style d'interface Java SCA et le style d'interface EJB existant.

Pour créer le composant EJB personnalisé :
  1. Sous le projet de module, développez Interfaces et sélectionnez l'interface WSDL générée pour cet EJB dans WebSphere Studio Application Developer Integration.
  2. Effectuez un glisser-déposer de cette interface vers l'éditeur d'assemblage. Une boîte de dialogue vous demande de sélectionner le type de composant à créer. Sélectionnez Composant (sans type d'implémentation) et cliquez sur OK.
  3. Un composant générique apparaît dans le diagramme de l'assemblage. Sélectionnez-le et accédez à la vue Propriétés.
  4. Dans l'onglet Description, vous pouvez remplacer le nom et le nom d'affichage du composant par un nom plus descriptif. Attribuez-lui le nom de votre EJB et ajoutez un suffixe tel que "JavaMed", car ce composant Java servira d'intermédiaire entre l'interface WSDL générée pour l'EJB dans WebSphere Studio Application Developer Integration et l'interface Java de l'EJB.
  5. Dans l'onglet Détails, vous voyez que ce composant a une interface (celle pour laquelle vous avez effectué un glisser-déposer vers l'éditeur d'assemblage).
  6. Dans l'éditeur d'assemblage, cliquez avec le bouton droit de la souris sur le composant que vous venez de créer et sélectionnez Générer l'implémentation… > Java Sélectionnez ensuite le package dans lequel l'implémentation Java sera générée. Cette opération crée un service Java squelette conforme à l'interface WSDL selon le modèle de programmation SCA, où les types complexes sont représentés par un objet de type commonj.sdo.DataObject et où les types simples sont représentés par leurs équivalents objet Java.
Les exemples de code suivants affichent :
  1. des définitions appropriées provenant de l'interface WSDL 5.1 ;
  2. les méthodes Java de WebSphere Studio Application Developer Integration Edition 5.1 qui correspondent à l'interface WSDL ;
  3. les méthodes Java de WebSphere Integration Developer 6.0 pour la même interface WSDL.
Le code suivant affiche les définitions appropriées provenant de l'interface WSDL 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>
Le code suivant affiche les méthodes Java de WebSphere Studio Application Developer Integration Edition 5.1 qui correspondent à l'interface WSDL :
public StockInfo getStockInfo(String symbol)
	{
		return new StockInfo();
	}

	public void setStockPrice(String symbol, float newPrice)
	{
		// set some things
	}
Le code suivant affiche les méthodes Java de WebSphere Integration Developer 6.0 pour la même interface 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.
	}
Pour finir, vous devez entrer du code réel aux endroits où vous voyez les balises "//TODO" dans la classe d'implémentation Java générée. Commencez par créer une référence de ce composant Java vers l'EJB réel de sorte qu'il puisse accéder à l'EJB selon le modèle de programmation SCA :
  1. Laissez l'éditeur d'assemblage ouvert et accédez à J2EE. Localisez le projet EJB contenant l'EJB pour lequel vous créez un service.
  2. Développez Descripteur de déploiement : <nom-projet> et localisez l'EJB. Effectuez un glisser-déposer vers l'éditeur d'assemblage. Si un message vous informe que les dépendances du projet doivent être mises à jour, cochez la case Ouvrir l'éditeur de dépendances du module… et cliquez sur OK.
  3. Sous la section J2EE, assurez-vous que le projet EJB est répertorié et, dans le cas contraire, ajoutez-le en cliquant sur le bouton Ajouter….
  4. Enregistrez les dépendances du module et fermez cet éditeur. Vous voyez qu'une nouvelle importation a été créée dans l'éditeur d'assemblage. Vous pouvez le sélectionner et accéder à la vue Propriétés de l'onglet Description afin de remplacer le nom et le nom d'affichage de cette importation par un nom plus explicite. Dans l'onglet Connexion, vous remarquez que le type d'importation a automatiquement la valeur Connexion de bean session sans état et que le nom JNDI de l'EJB est déjà défini de manière appropriée.
  5. Sélectionnez l'outil Connexion dans la palette de l'éditeur d'assemblage.
  6. Cliquez sur le composant Java et relâchez le bouton de la souris.
  7. Ensuite, cliquez sur l'importation EJB et relâchez le bouton de la souris.
  8. Vous allez voir apparaître un message Une référence correspondante va être créée sur le noeud source. Voulez-vous continuer ? Cliquez sur OK. Une connexion est créée entre les deux composants.
  9. Sélectionnez le composant Java dans l'éditeur d'assemblage et dans la vue Propriétés de l'onglet Détails, développez Références, puis sélectionnez la référence à l'EJB que vous venez de créer. Vous pouvez mettre à jour le nom de la référence si le nom généré n'est pas assez descriptif ou pas approprié. N'oubliez pas le nom de cette référence en vue d'une utilisation future.
  10. Enregistrez le diagramme de l'assemblage.
Vous devez utiliser le modèle de programmation SCA pour appeler l'EJB à partir de la classe Java générée. Ouvrez la classe Java générée et suivez ces étapes pour écrire le code qui appellera le service EJB. Pour la classe d'implémentation Java générée :
  1. Créez une variable privée (dont le type correspond à celui de votre interface EJB distante) :
    private YourEJBInterface ejbService = null;
  2. Si votre interface EJB contient des types complexes, créez également une variable privée pour BOFactory :
    private BOFactory boFactory = (BOFactory) 
    	ServiceManager.INSTANCE.locateService(“com/ibm/websphere/bo
    	/BOFactory”);
  3. Dans le constructeur de la classe d'implémentation Java, utilisez les API SCA pour résoudre la référence EJB (pensez à indiquer le nom de la référence EJB que vous avez écrit dans une étape précédente) et affectez à la variable privée la même valeur que cette référence :
    // Locate the EJB service
    	this.ejbService = (YourEJBInterface) 
    	ServiceManager.INSTANCE.locateService("name-of-your-ejb-reference");
Pour chaque balise "//TODO" dans la classe d'implémentation Java générée :
  1. Convertissez tous les paramètres en types de paramètre attendus par l'EJB.
  2. Appelez la méthode appropriée sur la référence EJB à l'aide du modèle de programmation SCA, en envoyant les paramètres convertis.
  3. Convertissez la valeur de retour de l'EJB en type de valeur de retour déclaré par la méthode d'implémentation Java générée.
/**
	 * 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();
		}

	}

Commentaires
(C) Copyright IBM Corporation 2005. Tous droits réservés.