< Anterior | Siguiente >

Lección 7: Añadir inyección de dependencias entre paquetes

En la lección anterior ha aprendido a utilizar la inyección de dependencias en un paquete. La inyección de dependencias entre paquetes requiere una entrada de referencia adicional en el archivo de configuración blueprint.

Antes de empezar esta lección, detenga el servidor. En la vista Servidores (Ventana > Mostrar vista > Servidores), pulse ele botón derecho del ratón en WebSphere Application Server y seleccione Detener.

Creación de un proyecto de paquete

Para crear un proyecto de paquete y añadirlo a un proyecto de aplicación OSGi:
  1. Pulse Archivo > Nuevo > Otros y, a continuación, expanda OSGi.
  2. Pulse Proyecto de paquete OSGi y, a continuación, pulse Siguiente. Se abrirá la ventana Nuevo proyecto de paquete OSGi.
  3. En el campo Nombre de proyecto, escriba CounterWorldBundle.
  4. Seleccione uno de los servidores siguientes de la lista de tiempo de ejecución de destino:
    • WebSphere Application Server v7.0
    • WebSphere Application Server v8.0
    • WebSphere Application Server v8.5
    • WebSphere Application Server V8.5 Liberty Profile
  5. Asegúrese de que se visualice CounterApp en el campo Proyecto de aplicación y, a continuación, pulse Finalizar.

Adición de un servicio en el paquete

En esta lección, va a crear un servicio simple, Mundo que devuelve una serie de texto desde el método World.getText().
  1. Cree el paquete:
    1. En el Explorador empresarial, expanda CounterWorldBundle.
    2. Pulse el botón derecho del ratón en src y, a continuación, seleccione Nuevo > Paquete. Se abrirá el asistente Nuevo paquete Java™.
    3. En el campo Nombre, escriba com.ibm.ws.eba.world y, a continuación, pulse Finalizar. El paquete se crea en la carpeta src.
  2. Cree la clase de interfaz:
    1. Pulse el botón derecho del ratón en el paquete com.ibm.ws.eba.world y, a continuación, pulse Nuevo > Interfaz. Se abrirá el asistente Nueva interfaz Java.
    2. En el campo Nombre, escriba Mundo y, a continuación, pulse Finalizar. Se creará la interfaz en el paquete y se abrirá en el editor.
    3. Añada el método getText() en la interfaz. El código siguiente es el resultado:
      package com.ibm.ws.eba.world;
      
      public interface World {
      	public String getText();
      }
    4. Guarde World.java.
  3. Cree la clase de implementación:
    1. Pulse el botón derecho del ratón en el paquete com.ibm.ws.eba.world y, a continuación, pulse Nuevo > Clase. Se abrirá el asistente Nueva clase Java.
    2. En el campo Nombre, escriba WorldImpl.
    3. Junto a la lista de interfaces, pulse Añadir. Se abrirá el diálogo Solución de interfaces implementadas.
    4. En el campo Elegir interfaces, escriba Mundo. Seleccione la interfaz Mundo para com.ibm.ws.eba.world y, a continuación, pulse Aceptar.
    5. Pulse Finalizar. Se creará la clase en el paquete y se abrirá en el editor.
    6. Añada la implementación para el método getText(). Añada un método de inicialización que confirme que el servicio se inicia en el servidor. El código siguiente es el resultado:
      package com.ibm.ws.eba.world;
      
      public class WorldImpl implements World {
      
        @Override
        public String getText() {
          return " World!";
        }
      		
        public void init() {
         System.out.println("WorldImpl.init() called.");
        }
      }
    7. Guarde WorldImpl.java.
  4. Cree el archivo de configuración blueprint:
    1. Pulse el botón derecho del ratón en el proyecto CounterWorldBundle y seleccione Nuevo > Otro > OSGi > Archivo Blueprint y, a continuación, pulse Siguiente.
    2. Pulse Finalizar. Se abrirá el archivo de configuración blueprint en el editor.
  5. Añada la información de configuración y ensamblaje de componentes en el archivo de configuración blueprint:
    1. En la pestaña Diseño del editor, pulse Añadir. Se abrirá el diálogo Añadir elemento.
    2. Pulse Bean y, a continuación, pulse Aceptar. El bean se añade a la configuración.
    3. Configure el bean:
      • En el campo ID, escriba WorldBean.
      • En el campo Clase, pulse Examinar. Se abrirá el diálogo Selección de tipo. En el campo Elegir nombre de tipo, escriba WorldImpl y, a continuación, seleccione la clase WorldImpl. Pulse Aceptar.
      • En el campo Método de inicialización, escriba init.
    4. Pulse Blueprint y, a continuación, pulse Añadir. Se abrirá el diálogo Añadir elemento.
    5. Pulse Servicio y, a continuación, pulse Aceptar. El servicio se añade a su configuración.
    6. Configure el servicio:
      • En el campo ID, escriba WorldService.
      • En el campo Interfaz, pulse Examinar y, a continuación, seleccione la interfaz Mundo.
      • En el campo Referencia, pulse Examinar y, a continuación, seleccione Bean: WorldBean. Pulse Aceptar.
    7. Guarde el archivo.
  6. Exporte el paquete:
    1. Expanda CounterWorldBundle y, a continuación, efectúe una doble pulsación en Manifiesto: CounterWorldBundle para abrir el archivo de manifiesto de paquete en el editor.
    2. Seleccione la pestaña Tiempo de ejecución.
    3. En la sección Paquetes exportados del editor, pulse Añadir. Se abrirá el diálogo Paquetes exportados.
    4. Pulse com.ibm.ws.eba.world en la lista de paquetes y, a continuación, pulse Aceptar.
    5. Guarde el archivo de manifiesto de paquete.

Actualización del bean para utilizar el servicio nuevo

Ahora que ha implementado el servicio Mundo, debe actualizar el bean GreetImpl y el archivo de manifiesto de paquete CounterServiceBundle para utilizar el servicio Mundo.
  1. Importe el paquete:
    1. En el Explorador empresarial, expanda CounterServiceBundle y, a continuación, efectúe una doble pulsación en Manifiesto: CounterServiceBundle para abrir el archivo de manifiesto de paquete en el editor.
    2. Seleccione la pestaña Dependencias.
    3. En la sección Paquetes importados del editor, pulse Añadir. Se abre el diálogo Paquetes importados.
    4. Pulse com.ibm.ws.eba.world en la lista de paquetes y, a continuación, pulse Aceptar.
    5. Guarde el archivo de manifiesto de paquete.
  2. Actualice GreetImpl.java:
    1. En el Explorador empresarial, expanda CounterServiceBundle > src > com.ibm.ws.eba.counter y, a continuación, efectúe una doble pulsación en GreetImpl.java para abrir el archivo en el editor.
    2. Añada la siguiente declaración de variable y defina el método para el bean Mundo:
      private World worldBean;
      public void setWorldBean(World b)
      {
        worldBean = b;
      }
    3. En el menú principal, pulse Origen > Organizar importaciones. Las sentencias de importación que faltan se añaden al código.
    4. Actualice el método getText() para invocar al servicio nuevo:
      public String getText(){
        return counter.getCount()+" Hello"+worldBean.getText();
      }
    5. Guarde el archivo.
    El código siguiente es el resultado:
    package com.ibm.ws.eba.counter;
    
    import com.ibm.ws.eba.world.World;
    
    public class GreetImpl implements Greet {
      private World worldBean;
      public void setWorldBean(World b)
      {
        worldBean = b;
      }
    	
      private Counter counter;
    	
      public void setCounter(Counter c) {
        counter = c;
      }
    
      @Override
      public String getText(){
        return counter.getCount()+" Hello"+worldBean.getText();
    }
    	
      public void init() {
        System.out.println("GreetImpl.init() called");
      }
    
    }

Actualización del archivo de configuración blueprint

Para que el contenedor blueprint inyecte una instancia del bean Mundo en GreetImpl, debe añadir la referencia al archivo de configuración blueprint.
  1. Expanda CounterServiceBundle > BundleContent > OSGI-INF > blueprint y, a continuación, efectúe una doble pulsación en blueprint.xml para abrir el archivo de configuración blueprint en el editor.
  2. En la pestaña Diseño del editor, seleccione Blueprint y, a continuación, pulse Añadir. Se abrirá el diálogo Añadir elemento.
  3. Pulse Referencia y, a continuación, pulse Aceptar. Se abrirá el diálogo Detalles de referencia.
  4. Configure la referencia:
    • En el campo ID de referencia, escriba WorldRef.
    • En el campo Interfaz de referencia, pulse Examinar y, a continuación, seleccione la interfaz Mundo que ha creado. Pulse Aceptar.
    • Pulse Aceptar para aceptar los cambios y cerrar el diálogo.
    La referencia se añade al archivo blueprint.
  5. En la sección Visión general, pulse el nodo GreetBean (Bean) y, a continuación, pulse Añadir. Se abrirá el diálogo Añadir elemento.
  6. Pulse Propiedad y, a continuación, pulse Aceptar. La propiedad se añade a la configuración.
  7. Configure la propiedad:
    • En el campo Nombre, escriba worldBean.
    • En el campo Referencia, pulse Examinar. Se abrirá el diálogo Selección de la referencia. Pulse Reference: WorldRef y, a continuación, pulse Aceptar.
  8. Guarde el archivo.

Despliegue de la aplicación

  1. En el Explorador empresarial, expanda CounterWebBundle > CounterWebBundle > Servlets.
  2. Pulse el botón derecho del ratón en CounterServlet y seleccione Ejecutar como > Ejecutar en servidor. Se abre el diálogo Ejecutar en servidor.
  3. Pulse Finalizar.

La serie greet.getText()=0 Hello World! se mostrará en el navegador. Cada vez que se vuelve a cargar la página, incrementa el valor.

Conmute a la vista Consola (Ventana > Mostrar vista > Consola) para ver la salida del servidor. Un resultado satisfactorio muestra la salida de CounterImpl.init(), GreetImpl.init() y WorldImpl.init(), en base a las entradas del método de inicialización para los beans CounterImpl, GreetImpl y WorldImpl en el archivo blueprint:
1/10 13:07:26:250 EDT] 000000aa StepStartBLA  A   CWWMH0300I: Se está iniciando la aplicación de nivel empresarial "WebSphere:blaname=CounterApp".
[3/31/10 13:07:27:000 EDT] 000000aa webapp        I com.ibm.ws.webcontainer.webapp.WebGroupImpl WebGroup SRVE0169I: Cargando módulo web: CounterWebBundle.
[3/31/10 13:07:27:046 EDT] 000000aa WASSessionCor I SessionContextRegistry getSessionContext SESN0176I: Se creará un contexto de sesión nueva para la clave de aplicaciones default_hostCounterWebBundle
[3/31/10 13:07:27:062 EDT] 000000aa webcontainer  I com.ibm.ws.wswebcontainer.VirtualHost addWebApplication SRVE0250I: El módulo web CounterWebBundle se ha enlazado a default_host[*:9083,*:80,*:9446,*:5067,*:5066,*:443].
[3/31/10 13:07:27:078 EDT] 000000aa FileLocatorIm E   CWPST0164E: No se encuentra la unidad de composición CounterWebBundle.
[3/31/10 13:07:27:093 EDT] 000000aa StepStartBLA  A   CWWMH0196I: La aplicación de nivel empresarial "WebSphere:blaname=CounterApp" se ha iniciado correctamente.
[3/31/10 13:07:27:109 EDT] 00000066 SystemOut     O Se ha invocado WorldImpl.init()
[3/31/10 13:07:27:109 EDT] 00000015 SystemOut     O Se ha invocado CounterImpl.init()
[3/31/10 13:07:27:125 EDT] 00000015 SystemOut     O Se ha invocado GreetImpl.init() 
Nota: Si no se visualiza la salida de CounterImpl.init(), GreetImpl.init() y WorldImpl.init() en la salida de la consola, compruebe los mensajes de error durante el despliegue o el arranque de la aplicación y, a continuación, compruebe los archivos blueprint por si hubiera errores en las definiciones del bean y del servicio.

Punto de comprobación de la lección

Ha aprendido a utilizar la inyección de dependencias blueprint para permitir que un bean utilice los servicios de otros.

En esta lección, ha aprendido a utilizar una referencia blueprint para configurar la inyección de dependencias de proyectos cruzadas.
< Anterior | Siguiente >
Icono que indica el tipo de tema Tema de lección de guía de aprendizaje
Términos y condiciones para centros de información | Comentarios

Icono de indicación de fecha y hora Última actualización: 22 de abril de 2014

Nombre de archivo: counter_lesson8.html