Integración de clientes de servicio web JAX-WS en HCL Commerce Developer

Se puede crear un cliente de servicio web JAX-WS a partir del archivo WSDL. El único punto a tener en cuenta es su referencia de servicio.

Es decir, si define un cliente de servicio web en el módulo web de tiendas, la referencia del servicio no será visible si realiza la ejecución fuera de contexto de Tiendas. Por ejemplo, si intenta utilizar el cliente de servicio web desde un trabajo de planificador, la llamada fallará.

Para que el cliente de servicio web esté disponible para todos los módulos, se recomienda crear el cliente en WebSphereCommerceExtensionsData o en un módulo EJB nuevo. A continuación, puede utilizar una fachada de bean de sesión sin estado para acceder al servicio.

Antes de empezar

Para ejecutar satisfactoriamente este ejemplo, debe existir un servidor. Puede crear un servicio ficticio a partir del archivo WSDL mediante SOAP, o puede instalar los siguientes archivos de muestra en un servidor de aplicaciones:

Procedimiento

  1. Cree el cliente de servicio web:
    1. Copie los archivos WSDL en la carpeta siguiente, o en cualquier otra carpeta del espacio de trabajo. Si copia los archivos utilizando Windows Explorer, debe renovar el espacio de trabajo:
      • workspace_dir\WebSphereCommerceServerExtensionsData\ejbModule\META-INF\wsdl
    2. Pulse el botón derecho del ratón en el archivo WSDL, por ejemplo, RewardPointsService.wsdl, y seleccione Servicios web > Generar cliente.
    3. Asegúrese de que el proyecto de cliente es WebSphereCommerceServerExtensionsData y complete el asistente.
  2. Cree la fachada de SessionBean:
    1. En la vista Explorador de empresa, expanda Proyectos EJB > WebSphereCommerceExtensionsData > Beans de sesión.
    2. Pulse el botón derecho del ratón en Beans de sesión y seleccione Nuevo > bean de sesión.
    3. Asegúrese de que Bean de sesión está seleccionado y utilice RewardPointsServiceSessionFacade como nombre de bean. Pulse Siguiente.
    4. Asegúrese de que la Vista de cliente remoto está seleccionada y pulse Finalizar.
    5. Abra la clase de bean RewardPointsServiceSessionFacadeBean.
    6. Añada un método que se utilizará para obtener el saldo de un cliente.
      Por ejemplo:
      
      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. En la vista Esquema, pulse el botón derecho del ratón en el método getBalance() y seleccione Bean de empresa (1.x-2.x) > Promocionar a interfaz remota.
    8. En la vista Explorador de empresa, expanda Proyectos EJB > WebSphereCommerceExtensionsData > Descriptor de despliegue.
    9. Pulse con el botón derecho del ratón en Descriptor de despliegue y seleccione Preparar para despliegue.
  3. Cree una clase de asistente para acceder al bean de sesión:
    1. En el proyecto WebSphereCommerceServerExtensionsLogic, cree una clase de asistente para obtener una referencia al bean de sesión.
      Por ejemplo:
      
      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. Cree un mandato de tarea para utilizar el bean de sesión:
    1. La creación de un mandato de tarea suele ser opcional, pero es recomendable. Por ejemplo:
      
      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);
          }
        }
      
      }