Mostrando entradas con la etiqueta Spring MVC. Mostrar todas las entradas
Mostrando entradas con la etiqueta Spring MVC. Mostrar todas las entradas

jueves, 18 de julio de 2013

Agregando un interceptor de mensajes SOAP XML (SOAP JaxWs Handler) con Spring de lado del cliente.

La idea con este artículo es mostrar como agregar un "handler" a nuestras peticiones SOAP, las cuales están siendo invocadas con JaxWs.

Con el "handler" se podrá interceptar el mensaje, ya sea cuando se envia la petición (se intercepta antes de enviar) ó cuando se recibe la respuesta  (se intercepta después de recibirla), esto puede servir para modificar la información de la cabecera del mensaje SOAP, con el fin de mandar información especial al servidor, ó simplemente para imprimir el mensaje "crudo" del XML con fines de monitoreo. El objetivo por el momento será solamente imprimir el XML del mensaje.

En Spring existe una forma de inyectar un objeto al bean que implementa la clase proxy generada por la herramienta wsdl2java, este objeto relacionará al "handler" con el webservices a través de la interface  HandlerResolver, esta interface es la que "encadena" a la verdadera clase que interceptará los mensajes. Esta debe implementar a SOAPHandler.

1. Creamos la clase DelegateSOAPHandler que implementará a la clase SOAPHandler.
public boolean handleMessage(SOAPMessageContext context);

El método handleMessage es invocado cuando una petición ó respuesta SOAP es procesada. El método getMessage() devuelve un objeto de tipo SOAPMessage, con el cual podemos acceder al contenido del mensaje SOAP y por lo tanto a modificarlo o sencillamente leerlo. Al final se debe regresar true, de lo contrario si se tienen enlazados más de un "handler", el resto ya no serán procesados.

El método public void handleMessageToLog(SOAPMessageContext context); se ha creado para generar la impresión de nuestro XML dentro del archivo log. Se agrego un poco más de código para darle un formato más claro al mensaje XML.

public boolean handleFault(SOAPMessageContext context);

El método handleFault, procesa los errores que sucedan en la comunicación SOAP. De la misma manera, al final regresamos true.

2. Creamos la clase DefaultHandlerResolver que implementará a la clase HandlerResolver.
Todos los objetos Handler que sean regresado en la lista por medio del método public List getHandlerChain(), seran asociados y usados por nuestro objeto proxy (port object) de nuestro servicio web. En otras palabras, si deseas asociar varias clases del tipo DelegateSOAPHandler. Para poder inyectar nuestra dependencia, se ha creado un método "setter".

3.- Configuracion de beans: applicationContext.xml
Para asignar el bean HandlerResolver, dentro del bean MetaDataWSInformation se debe agregar la propiedad handlerResolver-ref, por medio de esta propiedad, inyectamos el bean handlerResolver el cual es del tipo DefaultHandlerResolver. A su vez al bean handlerResolver por medio de la propiedad handlerList-ref se le inyecta el bean listHandler, quien implementa a SOAPHandler, justamente el objeto quien interceptara las peticiones de la comunicación SOAP.

Con esto ya podemos invocar nuestro objeto proxy que nos provee el bean MetaDataWSInformation para hacer una prueba de que todo funcione correctamente.

Abajo se muestra un ejemplo del XML de una petición y otro de la respuesta.

Por cierto, preferí dejar algunas palabras en inglés, ya que se indexa mejor la publicación, y por otra parte, al traducirlas pierden un poco el sentido :-].

Referencias:
  • http://docs.oracle.com/cd/E15051_01/wls/docs103/webserv_adv/handlers.html
  • http://pic.dhe.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Fcwbs_jaxwsclients.html
  • http://www.jroller.com/gmazza/entry/jaxws_handler_tutorial

sábado, 11 de febrero de 2012

QuickStart: Spring MVC


Este tutorial, pretende mostrar lo fácil que es el uso de Spring MVC.

Requerimientos:
  • Netbeans
  • Maven 3
  • Spring 3.x
  • Glassfish Server 3.x

Creación del proyecto.

Creamos un nuevo proyecto web con maven.




Agregamos las dependencias de Spring al archivo de configuración (pom.xml) de maven , con una propiedad para manejar la versión.

        ${project.build.directory}/endorsed
        UTF-8
        3.1.0.RELEASE
    

      
        
            org.springframework
            spring-core
            ${spring.version}
        
 
        
            org.springframework
            spring-webmvc
            ${spring.version}
        
 
        
            javax
            javaee-web-api
            6.0
            provided
        
    
    ...
Con la propiedad agregada para la versión de las dependencias de Spring se puede modificar fácilmente cuando se quiera actualizar a una más nueva.

Configuración de Spring.
  • Crearemos un archivo llamado spring-mvc-servlet.xml dentro de src/main/webapp/WEB-INF, para esto, agregamos primero la carpeta WEB-INF y dentro creamos dicho archivo.
  • Indicaremos en que paquete Spring buscará los controladores.
  • Indicaremos como se deben resolver las vistas, para asociarlas a los controladores.
Creación de la carpeta.

Después de crear la carpeta WEB-INF, dentro creamos el archivo spring-mvc-servlet.xml.


En la linea <context:component-scan base-package="net.jurasec.examples.quickstart" />, indicamos que dentro de ese paquete estarán nuestros controladores.

El bean "viewResolver", resuelve las llamadas a las vistas desde los controladores de la siguiente forma: prefijo + "nombre_vista" + sufijo.

Integrando Spring a la aplicación web.

  • Creamos el archivo de configuración de la aplicación web (web.xml) dentro de src/main/webapp/WEB-INF.

    
        contextConfigLocation
        /WEB-INF/spring-mvc-servlet.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    
    
        spring-mvc
        org.springframework.web.servlet.DispatcherServlet
        1
    
    
        spring-mvc
        /
    
    
        
            30
        
    
    
        index.jsp
    


Creamos la carpeta jsp, para crear dentro las vistas.
  • Creamos una carpeta llamada jsp dentro de WEB-INF y creamos un archivo *.jsp llamado welcome.jsp

La "variable" ${mensaje}, será sustituida por el valor que sea asignado al modelo, desde el controlador.


El controlador y la configuración de la vista.


package net.jurasec.examples.quickstart;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/start")
public class MainController {

    @RequestMapping(method = RequestMethod.GET)
    public String start(ModelMap model) {

        model.addAttribute("mensaje", "Iniciando con Spring 3 MVC...");
        return "welcome";

    }
}

Recordemos que en el archivo de configuración de Spring, indicamos que el paquete "net.jurasec.examples.quickstart" será analizado para buscar clases "anotadas" como controladores, para hacerlo agregamos @Controller. Después de decirle a Spring que esta clase es un controlador, debemos indicar cual será la URL a la cual responderá, esto se hace con @RequestMappin con la cual le decimos que cuando sea invocada la url "http://www.miurl.net/contexto/start" Spring recibirá la petición y la despachará hacia esta clase y dependiendo del tipo de metodo de la petición, la clase reaccionara. Aqui vemos que solo respondera a las peticiones de tipo GET, por medio del metodo start. El metodo start agrega un atributo(mensaje) al modelo, el cual será leido en la vista, finalmente regresa el nombre de la vista, que según la configuración del bean InternalResourceViewResolver será en /WEB-INF/jsp/welcome.jsp

El resultado final es:



Descarga el proyecto de Netbeans.