Diferencia entre revisiones de «MTOM con Spring Web Services»

De Dos Ideas.
Saltar a: navegación, buscar
(Página creada con 'Spring Web Services tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo MTOM. A continuación vamos a ver un ejem…')
 
m (Cliente)
Línea 95: Línea 95:
  
 
En breve...
 
En breve...
 +
 +
== Ver también ==
 +
* [[Spring Web Services]]
 +
 +
[[Category:Spring Framework]]
 +
[[Category:Web Service]]

Revisión del 00:57 21 mar 2010

Spring Web Services tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo MTOM.

A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.

Servidor

Para el servidor, vamos a crear un modulo web. La configuración del servlet de Spring Web Services es la estándar y vamos a hacer foco en los pasos siguientes.

Publicacion del servicio

La idea para este ejemplo es crear un servicio que sea la interfaz de un repositorio de archivos pdf, por lo tanto, deberíamos poder pasarle el nombre de un archivo y éste debería retornar el mismo en caso de encontrarlo. Teniendo en mente esto, creamos nuestro contrato (contract-first):

<element name="LoadPdfRequest" type="string"/>

<element name="LoadPdfResponse" type="tns:Pdf"/>

<complexType name="Pdf">

  <sequence>
    <element name="name" type="string"/>
    <element name="file" type="base64Binary" xmime:expectedContentTypes="application/pdf"/>
  </sequence>

</complexType>

De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo "base64Binary". Una vez resuelto el contrato, debemos decirle a Spring Web Services que lo publique. Esto lo hacemos a traves de un bean especifico que a partir de un schema, crea el WSDL:

<bean id="mtom" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">

       <property name="schema" ref="schema"/>
       <property name="portTypeName" value="PdfRepository"/>
       <property name="locationUri" value="/ws/pdf"/>

</bean>

Procesar invocación

Debemos configurar la aplicación, para que pueda procesar pedidos al servicio que publicamos en el paso anterior.

Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" />

Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:

<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">

       <constructor-arg ref="marshaller"/>

</bean>

Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">

 <property name="contextPath" value="com.dosideas.springws.ejemplos.mtom.schema"/>
 <property name="mtomEnabled" value="true"/>

</bean>

El próximo paso es generar a partir del esquema, las clases de 'bindeo' de JAXB. Para esto hay varias herramientas. En nuestro caso utilizamos el NetBeans (6.8): click derecho en el proyecto -> New.. -> Xml -> JAXB Binding. Entre las opciones que figuran, por un lado debemos elegir el .xsd que definimos anteriormente y por el otro el Package Name, que debe concordar con el valor del contextPath que le pusimos en la configuración al Jaxb2Marshaller (en nuestro caso "com.dosideas.springws.ejemplos.mtom.schema").

Una vez configurado JAXB, podemos proceder a implementar el endpoint:

@Endpoint public class PdfRepositorioEndPoint {

   /**
    * object factory creada por JAXB para bindear clases con el schema.
    */
   private ObjectFactory objectFactory = new ObjectFactory();
   @PayloadRoot(localPart = "LoadPdfRequest", namespace = "http://www.dosideas.com/spring-ws/ejemplos/mtom")
   public JAXBElement<Pdf> pedidoPdf(JAXBElement<String> requestElement) throws IOException {
       String nombrePdf = requestElement.getValue();
       Pdf response = new Pdf();
       response.setName(nombrePdf);
       //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.
       response.setFile(new DataHandler(getClass().getResource(nombrePdf)));
       return objectFactory.createLoadPdfResponse(response);
   }

}

Debemos prestarle atención a la creación del DataHandler, el cual se encarga de nuestro archivo binario. Luego es manejo trivial de Spring Web Services y JAXB.

Cliente

En breve...

Ver también