Intégration des clients de service Web JAX-WS dans HCL Commerce Developer

Un client de service Web JAX-WS peut être créé à partir du fichier WSDL. Le seul point à considérer est sa référence de service.

Si vous définissez le client de service Web dans le module Web Stores, la référence de service ne sera pas visible en cas d'exécution en dehors du contexte Stores. Par exemple, si vous essayez d'utiliser le client de service Web à partir d'un travail de planificateur, l'appel échouera.

Pour rendre le client de service Web accessible à tous les modules, il est recommandé de créer le client dans le module WebSphereCommerceExtensionsData ou dans un nouveau module EJB. Ensuite, vous pouvez utiliser une façade de bean session sans état pour accéder au service.

Avant de commencer

Pour exécuter cet exemple avec succès, un serveur doit être présent. Vous pouvez soit créer un service factice à partir du fichier WSDL à l'aide de SOAP, soit installer les exemples de fichiers suivants sur un serveur d'applications :

Procédure

  1. Créez le client de service Web :
    1. Copiez les fichiers WSDL dans le dossier suivant ou tout autre dossier dans l'espace de travail. Si vous copiez les fichiers à l'aide de l'Explorateur Windows, vous devez actualiser l'espace de travail :
      • workspace_dir\WebSphereCommerceServerExtensionsData\ejbModule\META-INF\wsdl
    2. Cliquez avec le bouton droit sur le fichier WSDL, par exemple, RewardPointsService.wsdl, puis sélectionnez Services Web > Générer un client.
    3. Assurez-vous que le projet client est WebSphereCommerceServerExtensionsData et suivez les étapes de l'assistant.
  2. Créez la façade SessionBean :
    1. Dans la vue Enterprise Explorer, développez Projets EJB > WebSphereCommerceExtensionsData > Beans de session.
    2. Cliquez avec le bouton droit sur Beans de session et sélectionnez Nouveau > Bean de session.
    3. Vérifiez que l'option Bean de session est sélectionnée et utilisez RewardPointsServiceSessionFacade comme nom de bean. Cliquez sur Suivant.
    4. Assurez-vous que la vue du client distant est sélectionnée et cliquez sur Terminer.
    5. Ouvrez la classe de bean RewardPointsServiceSessionFacadeBean.
    6. Ajoutez une méthode qui sera utilisée pour obtenir le solde d'un client.
      Par exemple :
      
      public Integer getBalance(Integer customerId ) {
         Integer balance = null;
         try {
            RewardPointsPortProxy proxy = new RewardPointsPortProxy(); 
            balance = proxy.getBalance( customerId );
         } catch ( Exception e ) {
            e.printStackTrace();
         }
         return balance;		
      }
      
    7. Dans la vue Contour, cliquez avec le bouton droit sur la méthode getBalance() et sélectionnez Enterprise Bean (1.x-2.x) > Promouvoir vers l'interface distante.
    8. Dans la vue Enterprise Explorer, développez Projets EJB > WebSphereCommerceExtensionsData > Descripteur de déploiement.
    9. Cliquez avec le bouton droit de la souris sur Descripteur de déploiement et sélectionnez Préparer pour le déploiement.
  3. Créez une classe d'aide pour accéder au bean de session :
    1. Dans le projet WebSphereCommerceServerExtensionsLogic, créez une classe d'aide pour obtenir une référence au bean de session.
      Par exemple :
      
      package com.mycompany.rewardpoints.proxy;
      
      import java.rmi.RemoteException;
      import javax.naming.Context;
      import javax.naming.InitialContext;
      import com.mycompany.RewardPointsServiceSessionFacade;
      import com.mycompany.RewardPointsServiceSessionFacadeHome;
      
      public class RewardPointsServiceHelper {
      
        private static RewardPointsServiceSessionFacade service = null;
      
        public static RewardPointsServiceSessionFacade getRewardPointsBean() {
      
          if ( service == null ) {
            try {
              Context ctx = new InitialContext();
              RewardPointsServiceSessionFacadeHome rewardsHome = (RewardPointsServiceSessionFacadeHome) ctx.lookup("ejb/com/mycompany/RewardPointsServiceSessionFacadeHome");
              service = rewardsHome.create();
      
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
      
          return service;
        }
      }
      
  4. Créez une commande de tâches pour utiliser le bean de session :
    1. La création d'une commande de tâche est généralement facultative, mais il s'agit d'une bonne pratique. Par exemple :
      
      package com.mycompany.rewardpoints;
      
      import java.util.logging.Level;
      import java.util.logging.Logger;
      import com.ibm.commerce.command.TaskCommandImpl;
      import com.mycompany.RewardPointsServiceSessionBeanProxy;
      import com.mycompany.rewardpoints.proxy.RewardPointsServiceHelper;
      
      public class RewardPointsTaskCmdImpl extends TaskCommandImpl implements
          RewardPointsTaskCmd {
      
        private static final String CLASS_NAME = RewardPointsTaskCmdImpl.class.getName();
        private static Logger logger = Logger.getLogger(CLASS_NAME);
      
        Integer customerId = null;
        Integer balance    = null;
      
        public void setCustomerId(Integer customerId) {
          this.customerId = customerId;
          this.balance    = null;
        }
      
        public Integer getBalance() {
          return balance;
        }
      
        public void performExecute() {
      
          final String methodName = "performExecute";
      
          if (logger.isLoggable(Level.FINER)) {
            logger.entering( CLASS_NAME, methodName);
          }
      
          try {
      
            RewardPointsServiceSessionBeanProxy rewards = RewardPointsServiceHelper.getRewardPointsBean();
            balance = rewards.getBalance(customerId);
      
            if (logger.isLoggable(Level.FINE)) {
               logger.logp( Level.FINE, CLASS_NAME, methodName, "Customer " + customerId + " Balance is " + balance );
            }
      
          } catch ( Exception e ) {
             logger.logp(Level.SEVERE, CLASS_NAME, methodName, e.getClass().getName(), e );
            e.printStackTrace();
          }
      
          if (logger.isLoggable(Level.FINER)) {
            logger.exiting( CLASS_NAME, methodName);
          }
        }
      
      }