<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pocho</id>
		<title>Dos Ideas. - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pocho"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/Pocho"/>
		<updated>2026-04-27T16:54:26Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Work_Manager_en_Weblogic&amp;diff=5267</id>
		<title>Work Manager en Weblogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Work_Manager_en_Weblogic&amp;diff=5267"/>
				<updated>2010-07-15T13:57:14Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: Página creada con 'Un Work Manager en Weblogic permite, entre otras cosas, crear limitaciones para los hilos (threads) de aquellas aplicaciones que estén asociadas a él.  == Configuración en We…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un Work Manager en Weblogic permite, entre otras cosas, crear limitaciones para los hilos (threads) de aquellas aplicaciones que estén asociadas a él.&lt;br /&gt;
&lt;br /&gt;
== Configuración en Weblogic 10.x ==&lt;br /&gt;
&lt;br /&gt;
El proceso consiste en crear por consola el Work Manager en si, y luego un componente especifico por cada limitación que quisiéramos activar.&lt;br /&gt;
&lt;br /&gt;
El primer paso es ir a la consola del Weblogic --&amp;gt; Enviroment --&amp;gt; Work Managers --&amp;gt; New --&amp;gt; Work Manager. El nombre que elijamos luego lo utilizaremos en la aplicacion destino.&lt;br /&gt;
&lt;br /&gt;
Luego debemos crear un componente por tipo de limitación que necesitamos. &lt;br /&gt;
&lt;br /&gt;
Si por ejemplo queremos que se ejecuten como máximo dos hilos y otros dos queden encolados, creamos un ''Maximum Threads Constraint'' con valor dos y ''Capacity Constraint'' con valor 4.&lt;br /&gt;
&lt;br /&gt;
Paso siguiente ingresamos en el Work Manager que creamos al comienzo, y le asignamos las limitaciones correspondientes. Recordar que al hacer este paso debemos reiniciar los servidores donde afecte dicha configuración.&lt;br /&gt;
&lt;br /&gt;
Finalmente debemos decirle a nuestra aplicacion que utilice un Work Manager específico y no el ''default'' que provee Weblogic. Esto se configura en los descriptores de nuestra aplicación. En el caso de una aplicacion web, lo indicamos en el ''weblogic.xml'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;weblogic-web-app xmlns=&amp;quot;http://www.bea.com/ns/weblogic/weblogic-web-app&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;context-root&amp;gt;/conexto-aplicacion&amp;lt;/context-root&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- nombre del work manager que creamos por consola --&amp;gt;&lt;br /&gt;
  &amp;lt;wl-dispatch-policy&amp;gt;miWorkManager&amp;lt;/wl-dispatch-policy&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/weblogic-web-app&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=WebLogic&amp;diff=5263</id>
		<title>WebLogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=WebLogic&amp;diff=5263"/>
				<updated>2010-07-15T13:13:50Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WebLogic es el [[Servidor de Aplicaciones]] [[Java EE]] de BEA (actualmente propiedad de [[Oracle]]).&lt;br /&gt;
&lt;br /&gt;
==Versiones==&lt;br /&gt;
=== 8.x ===&lt;br /&gt;
La version 8.x es compatible con el JDK 1.4 y JEE 1.4&lt;br /&gt;
&lt;br /&gt;
=== 9.x ===&lt;br /&gt;
La version 9.x es compatible con el JDK 5 y JEE 1.4 (con compatibilidad parcial para [[Java EE]] 5)&lt;br /&gt;
&lt;br /&gt;
=== 10.x ===&lt;br /&gt;
La versión 10.x es compatible con el [[Java SE]] 5 y [[Java EE]] 5. &lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[MDB en Weblogic]]&lt;br /&gt;
* [[Debug Remoto De Weblogic]]&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [[Compartir sesión en WebLogic]]&lt;br /&gt;
* [[SAF en WebLogic]]&lt;br /&gt;
* [[Transaction Manager en Weblogic]]&lt;br /&gt;
* [[Work Manager en Weblogic]]&lt;br /&gt;
&lt;br /&gt;
[[Category:WebLogic]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Integraci%C3%B3n_de_Maven_con_IDEs&amp;diff=4973</id>
		<title>Integración de Maven con IDEs</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Integraci%C3%B3n_de_Maven_con_IDEs&amp;diff=4973"/>
				<updated>2010-04-08T19:19:57Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: /* M2Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Eclipse ==&lt;br /&gt;
&lt;br /&gt;
Existen 2 plugins disponibles para Eclipse, pero solo uno se encuentra estable.&lt;br /&gt;
&lt;br /&gt;
=== M2Eclipse ===&lt;br /&gt;
&lt;br /&gt;
Provee las siguientes características:&lt;br /&gt;
&lt;br /&gt;
* Crear builds desde Eclipse.&lt;br /&gt;
* Configuración de las dependencias del proyecto desde el pom.xml&lt;br /&gt;
* Descarga automática de dependencias desde repositorios remotos de Maven.&lt;br /&gt;
* Editor gráfico del POM, incluyendo agregado de dependencias con Autocomplete.&lt;br /&gt;
* Wizards para la creación de proyectos Maven y para la conversión de proyectos sin Maven.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Update site: http://m2eclipse.sonatype.org/sites/m2e&lt;br /&gt;
&lt;br /&gt;
Para poder montar un proyecto en Eclipse, primero deberemos generar los archivos de configuración para el IDE. Esto realiza invocando la tarea:&lt;br /&gt;
&lt;br /&gt;
  mvn eclipse:eclipse&lt;br /&gt;
&lt;br /&gt;
Una vez ejecutada correctamente, el proyecto se puede montar en Eclipse accediendo a: File -&amp;gt; Import y en esa ventana General -&amp;gt; Existing Projects into Workspace.&lt;br /&gt;
&lt;br /&gt;
En caso que se vaya a trabajar con varios projectos en simultáneo (a través de un POM multiproyecto), es necesario realizar un paso previo para que el plugin de eclipse pueda interpretar correctamente las dependencias.&lt;br /&gt;
&lt;br /&gt;
  mvn install&lt;br /&gt;
  mvn eclipse:eclipse&lt;br /&gt;
&lt;br /&gt;
== NetBeans ==&lt;br /&gt;
&lt;br /&gt;
== Mas Detalles ==&lt;br /&gt;
* [http://m2eclipse.sonatype.org/ M2Eclipse Home Page]&lt;br /&gt;
* [[Maven]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM&amp;diff=4933</id>
		<title>MTOM</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM&amp;diff=4933"/>
				<updated>2010-03-31T18:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MTOM es un mecanismo optimizado, declarado por la W3C, para la transmisión de datos binarios a través de un [[Web Service]].&lt;br /&gt;
&lt;br /&gt;
La eficiencia de este mecanismo reside en el tamaño del texto que genera al transformar los datos binarios a texto. Transformación obligatoria al utilizar servicios web, ya que usan xml.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[MTOM con Spring Web Services]]&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
* [http://www.w3.org/TR/soap12-mtom/ SOAP Message Transmission Optimization Mechanism - MTOM en W3]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM&amp;diff=4932</id>
		<title>MTOM</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM&amp;diff=4932"/>
				<updated>2010-03-31T18:54:09Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MTOM es un mecanismo optimizado, declarado por la W3C, para la transmisión de datos binarios a través de un [[Web Service]].&lt;br /&gt;
&lt;br /&gt;
La eficiencia de este mecanismo reside en el tamaño del texto que genera al transformar los datos binarios a texto. Transformación obligatoria al utilizar servicios web, ya que usan xml.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[MTOM con Spring Web Services]]&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
* [[http://www.w3.org/TR/soap12-mtom/ SOAP Message Transmission Optimization Mechanism - MTOM en W3]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4899</id>
		<title>MTOM con Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4899"/>
				<updated>2010-03-22T13:54:21Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo [[MTOM]].&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Publicacion del servicio ===&lt;br /&gt;
&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- el request contiene un string con el path del pdf --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfRequest&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- la respuesta es del tipo pdf, que contiene el nombre y el archivo en si --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfResponse&amp;quot; type=&amp;quot;tns:Pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complexType name=&amp;quot;Pdf&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;file&amp;quot; type=&amp;quot;base64Binary&amp;quot; xmime:expectedContentTypes=&amp;quot;application/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;/complexType&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo &amp;quot;base64Binary&amp;quot;. 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;mtom&amp;quot; class=&amp;quot;org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;schema&amp;quot; ref=&amp;quot;schema&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;portTypeName&amp;quot; value=&amp;quot;PdfRepository&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;locationUri&amp;quot; value=&amp;quot;/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procesar invocación ===&lt;br /&gt;
&lt;br /&gt;
Debemos configurar la aplicación, para que pueda procesar pedidos del servicio que publicamos en el paso anterior. &lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Adaptador para serializar el pedido y la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- serializador con JAXB --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 -&amp;gt; New.. -&amp;gt; Xml -&amp;gt; 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 &amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Una vez configurado JAXB, podemos proceder a implementar el endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Endpoint&lt;br /&gt;
public class PdfRepositorioEndPoint {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
&lt;br /&gt;
    @PayloadRoot(localPart = &amp;quot;LoadPdfRequest&amp;quot;, namespace = &amp;quot;http://www.dosideas.com/spring-ws/ejemplos/mtom&amp;quot;)&lt;br /&gt;
    public JAXBElement&amp;lt;Pdf&amp;gt; pedidoPdf(JAXBElement&amp;lt;String&amp;gt; requestElement) throws IOException {&lt;br /&gt;
        String nombrePdf = requestElement.getValue();&lt;br /&gt;
        Pdf response = new Pdf();&lt;br /&gt;
        response.setName(nombrePdf);&lt;br /&gt;
        //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.&lt;br /&gt;
        response.setFile(new DataHandler(getClass().getResource(nombrePdf)));&lt;br /&gt;
&lt;br /&gt;
        return objectFactory.createLoadPdfResponse(response);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
&lt;br /&gt;
Si bien el cliente podría ser un test del servidor, vamos a crear en este ejemplo otro modulo web, por un lado para no confundir la configuración entre cliente y servidor y por el otro para poder visualizar en el browser el pdf.&lt;br /&gt;
&lt;br /&gt;
Básicamente vamos a tener un servlet, que invoca al servicio y luego escribe el pdf a la pagina.&lt;br /&gt;
&lt;br /&gt;
=== Configurar cliente ===&lt;br /&gt;
&lt;br /&gt;
En el ejemplo que se pueden bajar, van a encontrar dos implementaciones, una con Saaj (SOAP with Attachments API for Java) y otra con Axiom (Axis Object Model). A continuación vamos a detallar la implementación con Saaj.&lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean, indicando donde esta el servicio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Indicar donde esta el servicio que nos brinda el pdf --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;client&amp;quot; abstract=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:7001/mtom-pdf/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos el cliente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- cliente con la implementacion de SAAJ --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;saajClient&amp;quot; class=&amp;quot;com.dosideas.mtom.ws.SaajMtomClient&amp;quot; parent=&amp;quot;client&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;
       &amp;lt;bean class=&amp;quot;org.springframework.ws.soap.saaj.SaajSoapMessageFactory&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de utilizar Saaj, vamos a necesitar indicarle un serializador, y al igual que en el servidor, vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Serializador que utiliza SAAJ para enviar y leer la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.mtom.cliente.sws&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementar el cliente ===&lt;br /&gt;
&lt;br /&gt;
Para invocar servicios, Spring Web Services provee de una clase utilitaria que facilita bastante las cosas: '''WebServiceTemplate'''. En la configuración que realizamos en el paso anterior nos adelantamos a esto, indicándole a nuestro cliente donde estaba el servicio. &lt;br /&gt;
&lt;br /&gt;
El WebServiceTemplate lo podemos obtener, heredando de '''WebServiceGatewaySupport''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class SaajMtomClient extends WebServiceGatewaySupport {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
    /**&lt;br /&gt;
     * Construye el cliente a traves de la message factory.&lt;br /&gt;
     * @param messageFactory message factory que utiliza SAAJ.&lt;br /&gt;
     */&lt;br /&gt;
    public SaajMtomClient(SaajSoapMessageFactory messageFactory) {&lt;br /&gt;
        super(messageFactory);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que resta es el método principal que se encargue de enviar el pedido y procesar la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Carga un pdf en un DataHandler para luego poder leerlo.&lt;br /&gt;
 * @param path donde se encuentra el pdf.&lt;br /&gt;
 * @return un DataHandler que contiene el pdf.&lt;br /&gt;
*/&lt;br /&gt;
public DataHandler loadPdf(String path) {&lt;br /&gt;
   //generar el pedido a traves de la clase de bindeo de JAXB&lt;br /&gt;
   JAXBElement&amp;lt;String&amp;gt; loadPdfRequest = objectFactory.createLoadPdfRequest(StringUtils.getFilename(path));&lt;br /&gt;
   //invocar al servicio con el WebServiceTemplate&lt;br /&gt;
   JAXBElement&amp;lt;Pdf&amp;gt; loadPdfResponse =&lt;br /&gt;
                (JAXBElement&amp;lt;Pdf&amp;gt;) getWebServiceTemplate().marshalSendAndReceive(loadPdfRequest);&lt;br /&gt;
        &lt;br /&gt;
   Pdf pdf = loadPdfResponse.getValue();//clase bindeada con JAXB&lt;br /&gt;
     &lt;br /&gt;
   return pdf.getFile();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clase '''DataHandler''' nos permite obtener un '''InputStream''' para ir leyendo el pdf.&lt;br /&gt;
&lt;br /&gt;
La implementación del Servlet es bastante trivial y se puede ver en detalle en el archivo adjunto que esta disponible para bajar.&lt;br /&gt;
&lt;br /&gt;
Solo resta configurar el modulo para que levante la configuración de Spring Web Services. En el web.xml definimos un listener y le indicamos donde esta el archivo con la configuración:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;            &lt;br /&gt;
         classpath:cliente-springws.xml            &lt;br /&gt;
    &amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
     &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4898</id>
		<title>MTOM con Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4898"/>
				<updated>2010-03-22T13:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo [[MTOM]].&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Publicacion del servicio ===&lt;br /&gt;
&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- el request contiene un string con el path del pdf --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfRequest&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- la respuesta es del tipo pdf, que contiene el nombre y el archivo en si --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfResponse&amp;quot; type=&amp;quot;tns:Pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complexType name=&amp;quot;Pdf&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;file&amp;quot; type=&amp;quot;base64Binary&amp;quot; xmime:expectedContentTypes=&amp;quot;application/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;/complexType&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo &amp;quot;base64Binary&amp;quot;. 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;mtom&amp;quot; class=&amp;quot;org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;schema&amp;quot; ref=&amp;quot;schema&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;portTypeName&amp;quot; value=&amp;quot;PdfRepository&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;locationUri&amp;quot; value=&amp;quot;/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procesar invocación ===&lt;br /&gt;
&lt;br /&gt;
Debemos configurar la aplicación, para que pueda procesar pedidos del servicio que publicamos en el paso anterior. &lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Adaptador para serializar el pedido y la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- serializador con JAXB --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 -&amp;gt; New.. -&amp;gt; Xml -&amp;gt; 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 &amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Una vez configurado JAXB, podemos proceder a implementar el endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Endpoint&lt;br /&gt;
public class PdfRepositorioEndPoint {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
&lt;br /&gt;
    @PayloadRoot(localPart = &amp;quot;LoadPdfRequest&amp;quot;, namespace = &amp;quot;http://www.dosideas.com/spring-ws/ejemplos/mtom&amp;quot;)&lt;br /&gt;
    public JAXBElement&amp;lt;Pdf&amp;gt; pedidoPdf(JAXBElement&amp;lt;String&amp;gt; requestElement) throws IOException {&lt;br /&gt;
        String nombrePdf = requestElement.getValue();&lt;br /&gt;
        Pdf response = new Pdf();&lt;br /&gt;
        response.setName(nombrePdf);&lt;br /&gt;
        //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.&lt;br /&gt;
        response.setFile(new DataHandler(getClass().getResource(nombrePdf)));&lt;br /&gt;
&lt;br /&gt;
        return objectFactory.createLoadPdfResponse(response);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
&lt;br /&gt;
Si bien el cliente podría ser un test del servidor, vamos a crear en este ejemplo otro modulo web, por un lado para no confundir la configuración entre cliente y servidor y por el otro para poder visualizar en el browser el pdf.&lt;br /&gt;
&lt;br /&gt;
Básicamente vamos a tener un servlet, que invoca al servicio y luego escribe el pdf a la pagina.&lt;br /&gt;
&lt;br /&gt;
=== Configurar cliente ===&lt;br /&gt;
&lt;br /&gt;
En el ejemplo que se pueden bajar, van a encontrar dos implementaciones, una con Saaj (SOAP with Attachments API for Java) y otra con Axiom (Axis Object Model). A continuación vamos a detallar la implementación con Saaj.&lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean, indicando donde esta el servicio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Indicar donde esta el servicio que nos brinda el pdf --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;client&amp;quot; abstract=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:7001/mtom-pdf/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos el cliente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- cliente con la implementacion de SAAJ --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;saajClient&amp;quot; class=&amp;quot;com.dosideas.mtom.ws.SaajMtomClient&amp;quot; parent=&amp;quot;client&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;
       &amp;lt;bean class=&amp;quot;org.springframework.ws.soap.saaj.SaajSoapMessageFactory&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de utilizar Saaj, vamos a necesitar indicarle un serializador, y al igual que en el servidor, vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Serializador que utiliza SAAJ para enviar y leer la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.mtom.cliente.sws&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementar el cliente ===&lt;br /&gt;
&lt;br /&gt;
Para invocar servicios, Spring Web Services provee de una clase utilitaria que facilita bastante las cosas: '''WebServiceTemplate'''. En la configuración que realizamos en el paso anterior nos adelantamos a esto, indicándole a nuestro cliente donde estaba el servicio. &lt;br /&gt;
&lt;br /&gt;
El WebServiceTemplate lo podemos obtener, heredando de '''WebServiceGatewaySupport''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class SaajMtomClient extends WebServiceGatewaySupport {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
    /**&lt;br /&gt;
     * Construye el cliente a traves de la message factory.&lt;br /&gt;
     * @param messageFactory message factory que utiliza SAAJ.&lt;br /&gt;
     */&lt;br /&gt;
    public SaajMtomClient(SaajSoapMessageFactory messageFactory) {&lt;br /&gt;
        super(messageFactory);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que resta es el método principal que se encargue de enviar el pedido y procesar la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Carga un pdf en un DataHandler para luego poder leerlo.&lt;br /&gt;
 * @param path donde se encuentra el pdf.&lt;br /&gt;
 * @return un DataHandler que contiene el pdf.&lt;br /&gt;
*/&lt;br /&gt;
public DataHandler loadPdf(String path) {&lt;br /&gt;
   //generar el pedido a traves de la clase de bindeo de JAXB&lt;br /&gt;
   JAXBElement&amp;lt;String&amp;gt; loadPdfRequest = objectFactory.createLoadPdfRequest(StringUtils.getFilename(path));&lt;br /&gt;
   //invocar al servicio con el WebServiceTemplate&lt;br /&gt;
   JAXBElement&amp;lt;Pdf&amp;gt; loadPdfResponse =&lt;br /&gt;
                (JAXBElement&amp;lt;Pdf&amp;gt;) getWebServiceTemplate().marshalSendAndReceive(loadPdfRequest);&lt;br /&gt;
        &lt;br /&gt;
   Pdf pdf = loadPdfResponse.getValue();//clase bindeada con JAXB&lt;br /&gt;
     &lt;br /&gt;
   return pdf.getFile();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clase '''DataHandler''' nos permite obtener un '''InputStream''' para ir leyendo el pdf.&lt;br /&gt;
&lt;br /&gt;
La implementación del Servlet es bastante trivial y se puede ver en detalle en el archivo adjunto que esta disponible para bajar.&lt;br /&gt;
&lt;br /&gt;
Solo resta configurar el modulo para que levante la configuración de Spring Web Services. En el web.xml definimos un listener y le indicamos donde esta el archivo con la configuración:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;            &lt;br /&gt;
         classpath:cliente-springws.xml            &lt;br /&gt;
    &amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
     &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4897</id>
		<title>MTOM con Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4897"/>
				<updated>2010-03-22T13:49:20Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: /* Implementar el cliente */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo [[MTOM]].&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Publicacion del servicio ===&lt;br /&gt;
&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- el request contiene un string con el path del pdf --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfRequest&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- la respuesta es del tipo pdf, que contiene el nombre y el archivo en si --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfResponse&amp;quot; type=&amp;quot;tns:Pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complexType name=&amp;quot;Pdf&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;file&amp;quot; type=&amp;quot;base64Binary&amp;quot; xmime:expectedContentTypes=&amp;quot;application/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;/complexType&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo &amp;quot;base64Binary&amp;quot;. 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;mtom&amp;quot; class=&amp;quot;org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;schema&amp;quot; ref=&amp;quot;schema&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;portTypeName&amp;quot; value=&amp;quot;PdfRepository&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;locationUri&amp;quot; value=&amp;quot;/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procesar invocación ===&lt;br /&gt;
&lt;br /&gt;
Debemos configurar la aplicación, para que pueda procesar pedidos del servicio que publicamos en el paso anterior. &lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Adaptador para serializar el pedido y la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- serializador con JAXB --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 -&amp;gt; New.. -&amp;gt; Xml -&amp;gt; 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 &amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Una vez configurado JAXB, podemos proceder a implementar el endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Endpoint&lt;br /&gt;
public class PdfRepositorioEndPoint {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
&lt;br /&gt;
    @PayloadRoot(localPart = &amp;quot;LoadPdfRequest&amp;quot;, namespace = &amp;quot;http://www.dosideas.com/spring-ws/ejemplos/mtom&amp;quot;)&lt;br /&gt;
    public JAXBElement&amp;lt;Pdf&amp;gt; pedidoPdf(JAXBElement&amp;lt;String&amp;gt; requestElement) throws IOException {&lt;br /&gt;
        String nombrePdf = requestElement.getValue();&lt;br /&gt;
        Pdf response = new Pdf();&lt;br /&gt;
        response.setName(nombrePdf);&lt;br /&gt;
        //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.&lt;br /&gt;
        response.setFile(new DataHandler(getClass().getResource(nombrePdf)));&lt;br /&gt;
&lt;br /&gt;
        return objectFactory.createLoadPdfResponse(response);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
&lt;br /&gt;
Si bien el cliente podría ser un test del servidor, vamos a crear en este ejemplo otro modulo web, por un lado para no confundir la configuración entre cliente y servidor y por el otro para poder visualizar en el browser el pdf.&lt;br /&gt;
&lt;br /&gt;
Básicamente vamos a tener un servlet, que invoca al servicio y luego escribe el pdf a la pagina.&lt;br /&gt;
&lt;br /&gt;
=== Configurar cliente ===&lt;br /&gt;
&lt;br /&gt;
En el ejemplo que se pueden bajar, van a encontrar dos implementaciones, una con Saaj (SOAP with Attachments API for Java) y otra con Axiom (Axis Object Model). A continuación vamos a detallar la implementación con Saaj.&lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean, indicando donde esta el servicio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Indicar donde esta el servicio que nos brinda el pdf --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;client&amp;quot; abstract=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:7001/mtom-pdf/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos el cliente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- cliente con la implementacion de SAAJ --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;saajClient&amp;quot; class=&amp;quot;com.dosideas.mtom.ws.SaajMtomClient&amp;quot; parent=&amp;quot;client&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;
       &amp;lt;bean class=&amp;quot;org.springframework.ws.soap.saaj.SaajSoapMessageFactory&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de utilizar Saaj, vamos a necesitar indicarle un serializador, y al igual que en el servidor, vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Serializador que utiliza SAAJ para enviar y leer la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.mtom.cliente.sws&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementar el cliente ===&lt;br /&gt;
&lt;br /&gt;
Para invocar servicios, Spring Web Services provee de una clase utilitaria que facilita bastante las cosas: '''WebServiceTemplate'''. En la configuración que realizamos en el paso anterior nos adelantamos a esto, indicándole a nuestro cliente donde estaba el servicio. &lt;br /&gt;
&lt;br /&gt;
El WebServiceTemplate lo podemos obtener, heredando de '''WebServiceGatewaySupport''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class SaajMtomClient extends WebServiceGatewaySupport {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
    /**&lt;br /&gt;
     * Construye el cliente a traves de la message factory.&lt;br /&gt;
     * @param messageFactory message factory que utiliza SAAJ.&lt;br /&gt;
     */&lt;br /&gt;
    public SaajMtomClient(SaajSoapMessageFactory messageFactory) {&lt;br /&gt;
        super(messageFactory);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que resta es el método principal que se encargue de enviar el pedido y procesar la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Carga un pdf en un DataHandler para luego poder leerlo.&lt;br /&gt;
 * @param path donde se encuentra el pdf.&lt;br /&gt;
 * @return un DataHandler que contiene el pdf.&lt;br /&gt;
*/&lt;br /&gt;
public DataHandler loadPdf(String path) {&lt;br /&gt;
   //generar el pedido a traves de la clase de bindeo de JAXB&lt;br /&gt;
   JAXBElement&amp;lt;String&amp;gt; loadPdfRequest = objectFactory.createLoadPdfRequest(StringUtils.getFilename(path));&lt;br /&gt;
   //invocar al servicio con el WebServiceTemplate&lt;br /&gt;
   JAXBElement&amp;lt;Pdf&amp;gt; loadPdfResponse =&lt;br /&gt;
                (JAXBElement&amp;lt;Pdf&amp;gt;) getWebServiceTemplate().marshalSendAndReceive(loadPdfRequest);&lt;br /&gt;
        &lt;br /&gt;
   Pdf pdf = loadPdfResponse.getValue();//clase bindeada con JAXB&lt;br /&gt;
     &lt;br /&gt;
   return pdf.getFile();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clase '''DataHandler''' nos permite obtener un '''InputStream''' para ir leyendo el pdf.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4896</id>
		<title>MTOM con Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4896"/>
				<updated>2010-03-22T13:47:42Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: /* Implementar el cliete */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo [[MTOM]].&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Publicacion del servicio ===&lt;br /&gt;
&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- el request contiene un string con el path del pdf --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfRequest&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- la respuesta es del tipo pdf, que contiene el nombre y el archivo en si --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfResponse&amp;quot; type=&amp;quot;tns:Pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complexType name=&amp;quot;Pdf&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;file&amp;quot; type=&amp;quot;base64Binary&amp;quot; xmime:expectedContentTypes=&amp;quot;application/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;/complexType&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo &amp;quot;base64Binary&amp;quot;. 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;mtom&amp;quot; class=&amp;quot;org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;schema&amp;quot; ref=&amp;quot;schema&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;portTypeName&amp;quot; value=&amp;quot;PdfRepository&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;locationUri&amp;quot; value=&amp;quot;/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procesar invocación ===&lt;br /&gt;
&lt;br /&gt;
Debemos configurar la aplicación, para que pueda procesar pedidos del servicio que publicamos en el paso anterior. &lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Adaptador para serializar el pedido y la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- serializador con JAXB --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 -&amp;gt; New.. -&amp;gt; Xml -&amp;gt; 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 &amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Una vez configurado JAXB, podemos proceder a implementar el endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Endpoint&lt;br /&gt;
public class PdfRepositorioEndPoint {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
&lt;br /&gt;
    @PayloadRoot(localPart = &amp;quot;LoadPdfRequest&amp;quot;, namespace = &amp;quot;http://www.dosideas.com/spring-ws/ejemplos/mtom&amp;quot;)&lt;br /&gt;
    public JAXBElement&amp;lt;Pdf&amp;gt; pedidoPdf(JAXBElement&amp;lt;String&amp;gt; requestElement) throws IOException {&lt;br /&gt;
        String nombrePdf = requestElement.getValue();&lt;br /&gt;
        Pdf response = new Pdf();&lt;br /&gt;
        response.setName(nombrePdf);&lt;br /&gt;
        //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.&lt;br /&gt;
        response.setFile(new DataHandler(getClass().getResource(nombrePdf)));&lt;br /&gt;
&lt;br /&gt;
        return objectFactory.createLoadPdfResponse(response);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
&lt;br /&gt;
Si bien el cliente podría ser un test del servidor, vamos a crear en este ejemplo otro modulo web, por un lado para no confundir la configuración entre cliente y servidor y por el otro para poder visualizar en el browser el pdf.&lt;br /&gt;
&lt;br /&gt;
Básicamente vamos a tener un servlet, que invoca al servicio y luego escribe el pdf a la pagina.&lt;br /&gt;
&lt;br /&gt;
=== Configurar cliente ===&lt;br /&gt;
&lt;br /&gt;
En el ejemplo que se pueden bajar, van a encontrar dos implementaciones, una con Saaj (SOAP with Attachments API for Java) y otra con Axiom (Axis Object Model). A continuación vamos a detallar la implementación con Saaj.&lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean, indicando donde esta el servicio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Indicar donde esta el servicio que nos brinda el pdf --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;client&amp;quot; abstract=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:7001/mtom-pdf/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos el cliente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- cliente con la implementacion de SAAJ --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;saajClient&amp;quot; class=&amp;quot;com.dosideas.mtom.ws.SaajMtomClient&amp;quot; parent=&amp;quot;client&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;
       &amp;lt;bean class=&amp;quot;org.springframework.ws.soap.saaj.SaajSoapMessageFactory&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de utilizar Saaj, vamos a necesitar indicarle un serializador, y al igual que en el servidor, vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Serializador que utiliza SAAJ para enviar y leer la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.mtom.cliente.sws&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementar el cliente ===&lt;br /&gt;
&lt;br /&gt;
Para invocar servicios, Spring Web Services provee de una clase utilitaria que facilita bastante las cosas: '''WebServiceTemplate'''. En la configuración que realizamos en el paso anterior nos adelantamos a esto, indicándole a nuestro cliente donde estaba el servicio. &lt;br /&gt;
&lt;br /&gt;
El WebServiceTemplate lo podemos obtener, heredando de '''WebServiceGatewaySupport''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class SaajMtomClient extends WebServiceGatewaySupport {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
    /**&lt;br /&gt;
     * Construye el cliente a traves de la message factory.&lt;br /&gt;
     * @param messageFactory message factory que utiliza SAAJ.&lt;br /&gt;
     */&lt;br /&gt;
    public SaajMtomClient(SaajSoapMessageFactory messageFactory) {&lt;br /&gt;
        super(messageFactory);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que resta es el método principal que se encargue de enviar el pedido y procesar la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Carga un pdf en un DataHandler para luego poder leerlo.&lt;br /&gt;
 * @param path donde se encuentra el pdf.&lt;br /&gt;
 * @return un DataHandler que contiene el pdf.&lt;br /&gt;
*/&lt;br /&gt;
public DataHandler loadPdf(String path) {&lt;br /&gt;
   //pedido&lt;br /&gt;
   JAXBElement&amp;lt;String&amp;gt; loadPdfRequest = objectFactory.createLoadPdfRequest(StringUtils.getFilename(path));&lt;br /&gt;
   //respuesta&lt;br /&gt;
   JAXBElement&amp;lt;Pdf&amp;gt; loadPdfResponse =&lt;br /&gt;
                (JAXBElement&amp;lt;Pdf&amp;gt;) getWebServiceTemplate().marshalSendAndReceive(loadPdfRequest);&lt;br /&gt;
        &lt;br /&gt;
   Pdf pdf = loadPdfResponse.getValue();&lt;br /&gt;
     &lt;br /&gt;
   return pdf.getFile();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clase '''DataHandler''' nos permite obtener un '''InputStream''' para ir leyendo el pdf.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4895</id>
		<title>MTOM con Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4895"/>
				<updated>2010-03-22T13:46:25Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo [[MTOM]].&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Publicacion del servicio ===&lt;br /&gt;
&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- el request contiene un string con el path del pdf --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfRequest&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- la respuesta es del tipo pdf, que contiene el nombre y el archivo en si --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfResponse&amp;quot; type=&amp;quot;tns:Pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complexType name=&amp;quot;Pdf&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;file&amp;quot; type=&amp;quot;base64Binary&amp;quot; xmime:expectedContentTypes=&amp;quot;application/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;/complexType&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo &amp;quot;base64Binary&amp;quot;. 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;mtom&amp;quot; class=&amp;quot;org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;schema&amp;quot; ref=&amp;quot;schema&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;portTypeName&amp;quot; value=&amp;quot;PdfRepository&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;locationUri&amp;quot; value=&amp;quot;/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procesar invocación ===&lt;br /&gt;
&lt;br /&gt;
Debemos configurar la aplicación, para que pueda procesar pedidos del servicio que publicamos en el paso anterior. &lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Adaptador para serializar el pedido y la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- serializador con JAXB --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 -&amp;gt; New.. -&amp;gt; Xml -&amp;gt; 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 &amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Una vez configurado JAXB, podemos proceder a implementar el endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Endpoint&lt;br /&gt;
public class PdfRepositorioEndPoint {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
&lt;br /&gt;
    @PayloadRoot(localPart = &amp;quot;LoadPdfRequest&amp;quot;, namespace = &amp;quot;http://www.dosideas.com/spring-ws/ejemplos/mtom&amp;quot;)&lt;br /&gt;
    public JAXBElement&amp;lt;Pdf&amp;gt; pedidoPdf(JAXBElement&amp;lt;String&amp;gt; requestElement) throws IOException {&lt;br /&gt;
        String nombrePdf = requestElement.getValue();&lt;br /&gt;
        Pdf response = new Pdf();&lt;br /&gt;
        response.setName(nombrePdf);&lt;br /&gt;
        //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.&lt;br /&gt;
        response.setFile(new DataHandler(getClass().getResource(nombrePdf)));&lt;br /&gt;
&lt;br /&gt;
        return objectFactory.createLoadPdfResponse(response);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
&lt;br /&gt;
Si bien el cliente podría ser un test del servidor, vamos a crear en este ejemplo otro modulo web, por un lado para no confundir la configuración entre cliente y servidor y por el otro para poder visualizar en el browser el pdf.&lt;br /&gt;
&lt;br /&gt;
Básicamente vamos a tener un servlet, que invoca al servicio y luego escribe el pdf a la pagina.&lt;br /&gt;
&lt;br /&gt;
=== Configurar cliente ===&lt;br /&gt;
&lt;br /&gt;
En el ejemplo que se pueden bajar, van a encontrar dos implementaciones, una con Saaj (SOAP with Attachments API for Java) y otra con Axiom (Axis Object Model). A continuación vamos a detallar la implementación con Saaj.&lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean, indicando donde esta el servicio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Indicar donde esta el servicio que nos brinda el pdf --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;client&amp;quot; abstract=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:7001/mtom-pdf/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos el cliente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- cliente con la implementacion de SAAJ --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;saajClient&amp;quot; class=&amp;quot;com.dosideas.mtom.ws.SaajMtomClient&amp;quot; parent=&amp;quot;client&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;
       &amp;lt;bean class=&amp;quot;org.springframework.ws.soap.saaj.SaajSoapMessageFactory&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de utilizar Saaj, vamos a necesitar indicarle un serializador, y al igual que en el servidor, vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Serializador que utiliza SAAJ para enviar y leer la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.mtom.cliente.sws&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementar el cliete ===&lt;br /&gt;
&lt;br /&gt;
Para invocar servicios, Spring Web Services provee de una clase utilitaria que facilita bastante las cosas: '''WebServiceTemplate'''. En la configuración que realizamos en el paso anterior nos adelantamos a esto, indicándole a nuestro cliente donde estaba el servicio. &lt;br /&gt;
&lt;br /&gt;
El WebServiceTemplate lo podemos obtener, heredando de ''WebServiceGatewaySupport''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
public class SaajMtomClient extends WebServiceGatewaySupport {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
    /**&lt;br /&gt;
     * Construye el cliente a traves de la message factory.&lt;br /&gt;
     * @param messageFactory message factory que utiliza SAAJ.&lt;br /&gt;
     */&lt;br /&gt;
    public SaajMtomClient(SaajSoapMessageFactory messageFactory) {&lt;br /&gt;
        super(messageFactory);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que resta es el método principal que se encargue de enviar el pedido y procesar la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Carga un pdf en un DataHandler para luego poder leerlo.&lt;br /&gt;
 * @param path donde se encuentra el pdf.&lt;br /&gt;
 * @return un DataHandler que contiene el pdf.&lt;br /&gt;
*/&lt;br /&gt;
public DataHandler loadPdf(String path) {&lt;br /&gt;
   //pedido&lt;br /&gt;
   JAXBElement&amp;lt;String&amp;gt; loadPdfRequest = objectFactory.createLoadPdfRequest(StringUtils.getFilename(path));&lt;br /&gt;
   //respuesta&lt;br /&gt;
   JAXBElement&amp;lt;Pdf&amp;gt; loadPdfResponse =&lt;br /&gt;
                (JAXBElement&amp;lt;Pdf&amp;gt;) getWebServiceTemplate().marshalSendAndReceive(loadPdfRequest);&lt;br /&gt;
        &lt;br /&gt;
   Pdf pdf = loadPdfResponse.getValue();&lt;br /&gt;
     &lt;br /&gt;
   return pdf.getFile();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clase '''DataHandler''' nos permite obtener un '''InputStream''' para ir leyendo el pdf.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4894</id>
		<title>MTOM con Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4894"/>
				<updated>2010-03-22T13:11:33Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: /* Procesar invocación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo [[MTOM]].&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Publicacion del servicio ===&lt;br /&gt;
&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- el request contiene un string con el path del pdf --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfRequest&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- la respuesta es del tipo pdf, que contiene el nombre y el archivo en si --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfResponse&amp;quot; type=&amp;quot;tns:Pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complexType name=&amp;quot;Pdf&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;file&amp;quot; type=&amp;quot;base64Binary&amp;quot; xmime:expectedContentTypes=&amp;quot;application/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;/complexType&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo &amp;quot;base64Binary&amp;quot;. 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;mtom&amp;quot; class=&amp;quot;org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;schema&amp;quot; ref=&amp;quot;schema&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;portTypeName&amp;quot; value=&amp;quot;PdfRepository&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;locationUri&amp;quot; value=&amp;quot;/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procesar invocación ===&lt;br /&gt;
&lt;br /&gt;
Debemos configurar la aplicación, para que pueda procesar pedidos del servicio que publicamos en el paso anterior. &lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Adaptador para serializar el pedido y la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- serializador con JAXB --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 -&amp;gt; New.. -&amp;gt; Xml -&amp;gt; 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 &amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Una vez configurado JAXB, podemos proceder a implementar el endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Endpoint&lt;br /&gt;
public class PdfRepositorioEndPoint {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
&lt;br /&gt;
    @PayloadRoot(localPart = &amp;quot;LoadPdfRequest&amp;quot;, namespace = &amp;quot;http://www.dosideas.com/spring-ws/ejemplos/mtom&amp;quot;)&lt;br /&gt;
    public JAXBElement&amp;lt;Pdf&amp;gt; pedidoPdf(JAXBElement&amp;lt;String&amp;gt; requestElement) throws IOException {&lt;br /&gt;
        String nombrePdf = requestElement.getValue();&lt;br /&gt;
        Pdf response = new Pdf();&lt;br /&gt;
        response.setName(nombrePdf);&lt;br /&gt;
        //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.&lt;br /&gt;
        response.setFile(new DataHandler(getClass().getResource(nombrePdf)));&lt;br /&gt;
&lt;br /&gt;
        return objectFactory.createLoadPdfResponse(response);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
&lt;br /&gt;
En breve...&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4884</id>
		<title>MTOM con Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM_con_Spring_Web_Services&amp;diff=4884"/>
				<updated>2010-03-19T20:15:17Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: 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…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] tiene soporte para poder publicar y consumir web services que adjuntan un archivo, utilizando el protocolo [[MTOM]].&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver un ejemplo concreto de publicación e invocación a un Web Service de prueba.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Publicacion del servicio ===&lt;br /&gt;
&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- el request contiene un string con el path del pdf --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfRequest&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- la respuesta es del tipo pdf, que contiene el nombre y el archivo en si --&amp;gt;&lt;br /&gt;
&amp;lt;element name=&amp;quot;LoadPdfResponse&amp;quot; type=&amp;quot;tns:Pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complexType name=&amp;quot;Pdf&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;element name=&amp;quot;file&amp;quot; type=&amp;quot;base64Binary&amp;quot; xmime:expectedContentTypes=&amp;quot;application/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/sequence&amp;gt;&lt;br /&gt;
&amp;lt;/complexType&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo anterior, debemos prestar atención a la definición del archivo, en donde le indicamos que es del tipo &amp;quot;base64Binary&amp;quot;. 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;mtom&amp;quot; class=&amp;quot;org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;schema&amp;quot; ref=&amp;quot;schema&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;portTypeName&amp;quot; value=&amp;quot;PdfRepository&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;locationUri&amp;quot; value=&amp;quot;/ws/pdf&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procesar invocación ===&lt;br /&gt;
&lt;br /&gt;
Debemos configurar la aplicación, para que pueda procesar pedidos al servicio que publicamos en el paso anterior. &lt;br /&gt;
&lt;br /&gt;
Primero definimos un bean que busca la anotacion @Endpoint (un endpoint es el encargado de procesar el pedido):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego definimos un adaptador, para que procese el pedido de forma que el endpoint lo pueda entender. Lo mismo hace con la respuesta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- Adaptador para serializar el pedido y la respuesta del servicio --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;marshaller&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este adaptador necesita de un serializador. Aca es donde entra el manejo del archivo binario. Vamos a utilizar JAXB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- serializador con JAXB --&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;contextPath&amp;quot; value=&amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;mtomEnabled&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 -&amp;gt; New.. -&amp;gt; Xml -&amp;gt; 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 &amp;quot;com.dosideas.springws.ejemplos.mtom.schema&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Una vez configurado JAXB, podemos proceder a implementar el endpoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Endpoint&lt;br /&gt;
public class PdfRepositorioEndPoint {&lt;br /&gt;
    /**&lt;br /&gt;
     * object factory creada por JAXB para bindear clases con el schema.&lt;br /&gt;
     */&lt;br /&gt;
    private ObjectFactory objectFactory = new ObjectFactory();&lt;br /&gt;
&lt;br /&gt;
    @PayloadRoot(localPart = &amp;quot;LoadPdfRequest&amp;quot;, namespace = &amp;quot;http://www.dosideas.com/spring-ws/ejemplos/mtom&amp;quot;)&lt;br /&gt;
    public JAXBElement&amp;lt;Pdf&amp;gt; pedidoPdf(JAXBElement&amp;lt;String&amp;gt; requestElement) throws IOException {&lt;br /&gt;
        String nombrePdf = requestElement.getValue();&lt;br /&gt;
        Pdf response = new Pdf();&lt;br /&gt;
        response.setName(nombrePdf);&lt;br /&gt;
        //Se puede crear un DataHandler de muchas formas. Aca una simple para el ejemplo.&lt;br /&gt;
        response.setFile(new DataHandler(getClass().getResource(nombrePdf)));&lt;br /&gt;
&lt;br /&gt;
        return objectFactory.createLoadPdfResponse(response);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
&lt;br /&gt;
En breve...&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=MTOM&amp;diff=4883</id>
		<title>MTOM</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=MTOM&amp;diff=4883"/>
				<updated>2010-03-19T19:18:25Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: Página creada con 'MTOM es un mecanismo optimizado, declarado por la W3C, para la transmisión de datos binarios a través de un Web Service.  La eficiencia de este mecanismo reside en el tama…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MTOM es un mecanismo optimizado, declarado por la W3C, para la transmisión de datos binarios a través de un [[Web Service]].&lt;br /&gt;
&lt;br /&gt;
La eficiencia de este mecanismo reside en el tamaño del texto que genera al transformar los datos binarios a texto. Transformación obligatoria al utilizar servicios web, ya que usan xml.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[MTOM con Spring Web Services]]&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Spring Web Services]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Web Service]]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=XStream&amp;diff=2544</id>
		<title>XStream</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=XStream&amp;diff=2544"/>
				<updated>2009-04-03T17:57:12Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XStream es una libreria [[Java]] para la serializacion y deserealizacion de objetos a XML (o también [[JSON]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Encoding del XML==&lt;br /&gt;
XStream utiliza Writers para generar los XML, usando el encoding por default de la plataforma. Para cambiarlo, es necesario proveer a XStream con un Writer propio, que contenga el encoding deseado.&lt;br /&gt;
&lt;br /&gt;
Para hacer esto basta programar:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    private static final String ENCODING = &amp;quot;ISO-8859-1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    .....&lt;br /&gt;
&lt;br /&gt;
    OutputStream os = new ByteArrayOutputStream();&lt;br /&gt;
    OutputStreamWriter osw = new OutputStreamWriter(os, ENCODING);&lt;br /&gt;
&lt;br /&gt;
    XStream xstream = new XStream();&lt;br /&gt;
    xstream.toXML(objetoParaTransformar, osw);&lt;br /&gt;
&lt;br /&gt;
    String xml = os.toString();&lt;br /&gt;
&lt;br /&gt;
    osw.close();&lt;br /&gt;
    os.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La variable ENCODING puede tener alguno de los nombres de los charset estándares, o incluso algunos encoding no comunes.&lt;br /&gt;
&lt;br /&gt;
=== El XML con el encabezado correspondiente ===&lt;br /&gt;
&lt;br /&gt;
XStream no genera el encabezado de los XML, donde se indica el encoding usado. Es necesario entonces que lo generemos nosotros antes de devolver el xml.&lt;br /&gt;
&lt;br /&gt;
De esta forma:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    private static final String ENCODING = &amp;quot;ISO-8859-1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    .....&lt;br /&gt;
&lt;br /&gt;
    XStream xstream = new XStream();&lt;br /&gt;
    OutputStream os = new ByteArrayOutputStream();&lt;br /&gt;
    OutputStreamWriter osw = new OutputStreamWriter(os, ENCODING);&lt;br /&gt;
&lt;br /&gt;
    xstream.toXML(objetoParaTransformar, osw);&lt;br /&gt;
&lt;br /&gt;
    String header = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;&amp;quot; + osw.getEncoding() + &amp;quot;\&amp;quot;?&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    StringBuffer xml = new StringBuffer();&lt;br /&gt;
    xml.append(header);&lt;br /&gt;
    xml.append(os.toString());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Noten que creamos el encabezado para el XML, indicando el encoding que usaremos. Luego, concatenamos este encabezado al xml resultante.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo de uso ==&lt;br /&gt;
El [http://xstream.codehaus.org/tutorial.html Tutorial de XStream] tiene un ejemplo claro y simple de uso.&lt;br /&gt;
&lt;br /&gt;
Con XStream cuando serializamos una clase los tags del XML generado quedan con el nombre de los atributos de esta clase. Por ejemplo, aca vemos como serializamos el siguiente DTO compuesto:&lt;br /&gt;
===Los objetos a serializar===&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public class PersonaDTO {&lt;br /&gt;
&lt;br /&gt;
     private String identidad;&lt;br /&gt;
     private Long edad;&lt;br /&gt;
     private DocumentoDTO documentoIdentidad;&lt;br /&gt;
&lt;br /&gt;
     // Getters y Setters&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public class DocumentoDTO {&lt;br /&gt;
     private Long numero;&lt;br /&gt;
     private String tipo;&lt;br /&gt;
&lt;br /&gt;
     // Getters y Setters&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Serialización===&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 import com.thoughtworks.xstream.XStream;&lt;br /&gt;
&lt;br /&gt;
 public class XStreamConAnnotation {&lt;br /&gt;
     public String toXml(PersonaDTO dto) {&lt;br /&gt;
         XStream xstream = new XStream();&lt;br /&gt;
         return (String) xstream.toXML(dto);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===XML resultante===&lt;br /&gt;
Lo cual genera el siguiente XML:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;test.PersonaDTO.java&amp;gt;&lt;br /&gt;
   &amp;lt;identidad&amp;gt;Juancito&amp;lt;/identidad&amp;gt;&lt;br /&gt;
   &amp;lt;edad&amp;gt;16&amp;lt;/edad&amp;gt;&lt;br /&gt;
   &amp;lt;documentoIdentidad&amp;gt;&lt;br /&gt;
     &amp;lt;numero&amp;gt;35123125&amp;lt;/numero&amp;gt;&lt;br /&gt;
     &amp;lt;tipo&amp;gt;DNI&amp;lt;/tipo&amp;gt;&lt;br /&gt;
   &amp;lt;/documentoIdentidad&amp;gt;&lt;br /&gt;
 &amp;lt;/test.PersonaDTO.java&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es posible cambiar los nombres de los atributos en el XML utilizando los alias que provee XStream.&lt;br /&gt;
&lt;br /&gt;
==Ejemplo de uso con anotaciones==&lt;br /&gt;
Desde la version 1.3 de [XStream] se agrego como funcionalidad la posibilidad de usar Annotations en lugar de los alias para establecer el mapeo entre las clases, los atributos y los tags de los XML.&lt;br /&gt;
&lt;br /&gt;
Con esta nueva funcionalidad para modificar algun tag hay que hacer 2 cosas&lt;br /&gt;
# Anotar la clase&lt;br /&gt;
# Activar el uso de anotaciones al usar XStream&lt;br /&gt;
&lt;br /&gt;
===Anotación de la clase===&lt;br /&gt;
En las clases a serializar hay que poner sobre el atributo (o clase) la annotation con el nombre que queremos que tenga una vez serializado. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 @XStreamAlias(&amp;quot;Persona&amp;quot;)&lt;br /&gt;
 public class PersonaDTO {&lt;br /&gt;
&lt;br /&gt;
     @XStreamAlias(&amp;quot;nombre&amp;quot;)&lt;br /&gt;
     private String identidad;&lt;br /&gt;
&lt;br /&gt;
     @XStreamAlias(&amp;quot;años&amp;quot;)&lt;br /&gt;
     private Long edad;&lt;br /&gt;
&lt;br /&gt;
     @XStreamAlias(&amp;quot;documento&amp;quot;)&lt;br /&gt;
     private DocumentoDTO documentoIdentidad;&lt;br /&gt;
&lt;br /&gt;
     // Getters y Setters&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 public class DocumentoDTO {&lt;br /&gt;
&lt;br /&gt;
     @XStreamAlias(&amp;quot;numeroDocumento&amp;quot;)&lt;br /&gt;
     private Long numero;&lt;br /&gt;
&lt;br /&gt;
     @XStreamAlias(&amp;quot;tipoDocumento&amp;quot;)&lt;br /&gt;
     private String tipo;&lt;br /&gt;
&lt;br /&gt;
     // Getters y Setters&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Activación de anotaciones===&lt;br /&gt;
En el codigo que invoca a XStream se agrega para que procese las annotations, pasandole el .class de la clase que contiene las annotations.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public class XStreamConAnnotation {&lt;br /&gt;
&lt;br /&gt;
     public String toXml(PersonaDTO dto) {&lt;br /&gt;
         XStream xstream = new XStream();&lt;br /&gt;
         xstream.autodetectAnnotations(true);&lt;br /&gt;
&lt;br /&gt;
         return (String) xstream.toXML(dto);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También es posible activar clase-por-clase el uso de anotaciones, con una línea similar a&lt;br /&gt;
  xstream.processAnnotations(PersonaDTO.class);&lt;br /&gt;
&lt;br /&gt;
===XML resultante===&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;Persona&amp;gt;&lt;br /&gt;
   &amp;lt;nombre&amp;gt;Juancito&amp;lt;/nombre&amp;gt;&lt;br /&gt;
   &amp;lt;años&amp;gt;16&amp;lt;/años&amp;gt;&lt;br /&gt;
   &amp;lt;documento&amp;gt;&lt;br /&gt;
     &amp;lt;numeroDocumento&amp;gt;35123125&amp;lt;/numeroDocumento&amp;gt;&lt;br /&gt;
     &amp;lt;tipoDocumento&amp;gt;DNI&amp;lt;/tipoDocumento&amp;gt;&lt;br /&gt;
   &amp;lt;/documento&amp;gt;&lt;br /&gt;
 &amp;lt;/Persona&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Namespaces==&lt;br /&gt;
Es muy común con la utilización de Web Services que se tenga que procesar un xml que tiene definido un namespace. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;dosideas:Persona xmlns:dosideas=&amp;quot;http://www.dosideas.com/wsdl/buscarClientes&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;nombre&amp;gt;Juancito&amp;lt;/nombre&amp;gt;&lt;br /&gt;
 &amp;lt;años&amp;gt;16&amp;lt;/años&amp;gt;&lt;br /&gt;
&amp;lt;/dosideas:body&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se quiere mapear el ejemplo anterior con la clase PersonaDTO (definida en otro ejemplo anteriormente), se deberá colocar el alias @XStreamAlias(&amp;quot;'''dosideas:'''Persona&amp;quot;). Si solo se coloca @XStreamAlias(&amp;quot;Persona&amp;quot;), XStream no sabra contra que clase mapear &amp;quot;dosideas:Persona&amp;quot; ya que desconoce los namespaces. &lt;br /&gt;
&lt;br /&gt;
Como el namespace puede cambiar a gusto del consumidor (si es un Web Service por ejemplo), se deberá contar con algo mas genérico. Para solucionar este inconveniente se utiliza el StaxDriver que provee XStream, el cual permite especificar un map de QNames. &lt;br /&gt;
&lt;br /&gt;
Un QName  permite identificar un elemento o atributo de xml y tiene 3 componentes:&lt;br /&gt;
; Namespace URI : la definicion del namespace. En el ejemplo corresponde a ''xmlns:dosideas=&amp;quot;ht...&amp;quot;''&lt;br /&gt;
; local part : el nombre del tag. En el ejemplo corresponde a ''Persona''&lt;br /&gt;
; prefix : el prefijo. En el ejemplo corresponde a ''dosideas''&lt;br /&gt;
&lt;br /&gt;
Como se puede observar, lo que varia es el prefijo. Entonces se debe crear un QName dejando el prefijo en blanco. El código resultante para el ejemplo seria el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
QNameMap qnameMap = new QNameMap();&lt;br /&gt;
QName qname = new QName(&amp;quot;http://www.dosideas.com/wsdl/buscarClientes&amp;quot;,&lt;br /&gt;
                        &amp;quot;Persona&amp;quot;);&lt;br /&gt;
qnameMap.registerMapping(qname, PersonaDTO.class);&lt;br /&gt;
XStream xStream = new XStream(new StaxDriver(qnameMap));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Conversores==&lt;br /&gt;
La librería xstream nos provee de una serie de conversores. La función de un conversor es la de convertir tipos de objetos particulares en xml o construir los mismos a partir de un xml.&lt;br /&gt;
Entre los conversores que tiene xstream se destacan: String, File, Collections, arrays, and Dates. En la página oficial de xstream se encuentra [http://xstream.codehaus.org/converters.html la lista de todos los conversores].  &lt;br /&gt;
&lt;br /&gt;
==Ejemplo de uso DateConverter==&lt;br /&gt;
El DateConverter en un conversor para el tipo de objeto java.util.Date.&lt;br /&gt;
Para usarlo debemos crear una nueva instancia indicando los formatos de fechas aceptados&lt;br /&gt;
El constructor recibe dos parámetros: &lt;br /&gt;
&lt;br /&gt;
'''String defaultFormat:''' formato de la fecha que sera tomado por default. &lt;br /&gt;
&lt;br /&gt;
'''String[] acceptableFormats:''' Array con todos los formatos de fecha aceptables.&lt;br /&gt;
&lt;br /&gt;
Los formatos de la fecha esperados son los patrones de [http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html SimpleDateFormat].&lt;br /&gt;
&lt;br /&gt;
El funcionamiento se describe así: cuando xstream encuentra un tag que esta mapeado a un objeto del tipo java.util.Date usara el conversor, el mismo tratará de convertir el tag usando el formato default, si falla ira probando los otros formatos aceptados hasta encontrar el adecuado, de no encontrarlo lanzará una ConversionException. Si se se esta convirtiendo un objeto Date a xml siempre se usara el formato default para convertirlo. &lt;br /&gt;
&lt;br /&gt;
Supongamos que queremos convertir la siguiente clase usando el DateConverter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public class PersonaDTO {&lt;br /&gt;
&lt;br /&gt;
     private String identidad;&lt;br /&gt;
     private Date fechaNacimiento;&lt;br /&gt;
&lt;br /&gt;
     // Getters y Setters&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El formato esperado de la fecha será 'ddMMyyyy', el siguiente código muestra como crear y regisrar el DateConverter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
class Main {&lt;br /&gt;
    public static void main( String args[] ) {&lt;br /&gt;
        //objetoq ue se convertira a xml usando DateConverter&lt;br /&gt;
        PersonaDTO persona = new PersonaDTO();&lt;br /&gt;
        persona.setIdentidad(&amp;quot;dos ideas&amp;quot;);&lt;br /&gt;
        persona.setFechaNacimiento(new Date());&lt;br /&gt;
        &lt;br /&gt;
        //se crea una nueva instancia de DateConverter con los formatos requeridos&lt;br /&gt;
        String defaultFormat = &amp;quot;ddMMyyyy&amp;quot;&lt;br /&gt;
        String[] acceptableFormats = new String[]{&amp;quot;yyyyMM&amp;quot;};&lt;br /&gt;
        DateConverter dateConverter = new DateConverter(defaultFormat, acceptableFormats );&lt;br /&gt;
        &lt;br /&gt;
        //ya instanciamos nuestro DateConverter, falta registralo &lt;br /&gt;
        XStream xstream = new XStream();&lt;br /&gt;
        xstream.registerConverter(dateConverter);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(xstream.toXML(persona);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===XML resultante===&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;Persona&amp;gt;&lt;br /&gt;
  &amp;lt;identificacion&amp;gt;dos ideas&amp;lt;/identificacion&amp;gt;&lt;br /&gt;
  &amp;lt;fechaNacimiento&amp;gt;29112000&amp;lt;/fechaNacimiento&amp;gt;&lt;br /&gt;
&amp;lt;/Persona&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Serializacion De Objetos En Java]]&lt;br /&gt;
* [[JSON]]&lt;br /&gt;
* [http://xstream.codehaus.org/ Web oficial de XStream]&lt;br /&gt;
* [http://xstream.codehaus.org/tutorial.html Tutorial de XStream]&lt;br /&gt;
* [http://xstream.codehaus.org/json-tutorial.html Exportación a JSON con XStream]&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Spring&amp;diff=2537</id>
		<title>Stored Procedures con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Spring&amp;diff=2537"/>
				<updated>2009-04-01T15:05:03Z</updated>
		
		<summary type="html">&lt;p&gt;Pocho: Página creada con 'Spring Framework brinda una herramienta bastante práctica para invocar a stored procredures o funciones de forma de evitar el manejo de la conexión y facilitar el seteo de...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Framework]] brinda una herramienta bastante práctica para invocar a stored procredures o funciones de forma de evitar el manejo de la conexión y facilitar el seteo de los parámetros.&lt;br /&gt;
&lt;br /&gt;
==SimpleJdbcCall==&lt;br /&gt;
&lt;br /&gt;
Es una clase que provee Spring que representa la llamada a un stored procedure o store function. Se diferencia de cualquier otra clase utilitaria por leer la meta data de la base de datos, permitiendo que solo tengamos que pasarle en la invocación un map con los nombres de los parámetros y sus respectivos valores. No hace falta especificar los tipos de datos. Adicionalmente encapsula el manejo de la conexión y del statement (internamente usa otra clase mas genérica de Spring para JDBC llamada JdbcTemplate).&lt;br /&gt;
&lt;br /&gt;
Como depende de la información que brinda la meta data, que es obtenida por el driver JDBC, las bases soportadas son Derby, MySQL, Microsoft SQL Server, Oracle y DB2.&lt;br /&gt;
&lt;br /&gt;
===Ejemplo invocación===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public class MiDao  {&lt;br /&gt;
    &lt;br /&gt;
    private SimpleJdbcCall miStoreProcedureCall;   &lt;br /&gt;
        &lt;br /&gt;
    public void buscarDireccion(String pametro1, String parametro2) {  &lt;br /&gt;
        SqlParameterSource mapIn = new MapSqlParameterSource()&lt;br /&gt;
        .addValue(&amp;quot;CODIGO_CLIENTE&amp;quot;, pametro1)&lt;br /&gt;
        .addValue(&amp;quot;NUMERO_DOCUMENTO&amp;quot;, parametro2);&lt;br /&gt;
        &lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; out = getMiStoreProcedureCall().execute(mapIn);&lt;br /&gt;
&lt;br /&gt;
        String direccionCliente = (String) out.get(&amp;quot;DIRECCION&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Invocacion exitosa. Direccion cliente: &amp;quot;+direccionCliente);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuración===&lt;br /&gt;
&lt;br /&gt;
En el ejemplo se decidió por inyectar la clase utilitaria, utilizando configuración en xml. De igual manera se podría haber hecho en el mismo código Java. &lt;br /&gt;
&lt;br /&gt;
La clase SimpleJdbcCall necesita como parámetro del constructor el data source asociado a la base de datos en la cual se encuentra el store procedure. &lt;br /&gt;
&lt;br /&gt;
En el ejemplo, el procedure se encuentra dentro de un package y de ahí una propiedad extra que hay que configurar (sino simplemente obviarla). Arhivo xml: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;beans&amp;gt;&lt;br /&gt;
  &amp;lt;bean id=&amp;quot;dataSourceApp&amp;quot; class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot; &lt;br /&gt;
        destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;jndiName&amp;quot; value=&amp;quot;jdbc/miApp&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/bean&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;bean id=&amp;quot;jdbc.miStoreP&amp;quot; class=&amp;quot;org.springframework.jdbc.core.simple.SimpleJdbcCall&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;dataSourceApp&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;procedureName&amp;quot; value=&amp;quot;BUSCAR_DIRECCION&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;catalogName&amp;quot; value=&amp;quot;PACKAGE_CLIENTES&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;bean id=&amp;quot;dao.MiDao&amp;quot; class=&amp;quot;com.dosideas.MiDao&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;miStoreProcedureCall&amp;quot; ref=&amp;quot;jdbc.miStoreP&amp;quot;/&amp;gt;        &lt;br /&gt;
  &amp;lt;/bean&amp;gt;    &lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schema==&lt;br /&gt;
&lt;br /&gt;
Como se menciono anteriormente, esta clase se basa en la obtención de la meta data. Para asegurarnos de que la obtenga correctamente debemos saber mas en detalle como la obtiene. Si corremos el ejemplo con un nivel de log en debug vamos a ver lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Retrieving metadata for PACKAGE_CLIENTES/SCHEMA/BUSCAR_DIRECCION&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el dueño (owner) del package es diferente al del schema al cual nos estamos conectado, no va a poder obtener la meta data, aunque el mismo tenga un sinónimo publico. Lo importante es que Spring no da error en estos casos, sino que continua con la invocación. En nuestro caso seria algo del tipo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Compiled stored procedure. Call string is [{call PACKAGE_CLIENTES.BUSCAR_DIRECCION()}]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego la base de datos nos dara un error indicando que estamos invocando al procedure con una cantidad incorrecta de parametros (ninguno), ocultado el error que origina todo esto.&lt;br /&gt;
&lt;br /&gt;
Para solucionarlo basta con modificar la llamada al execute de SimpleJdbcCall de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Map&amp;lt;String, Object&amp;gt; out = getMiStoreProcedureCall().withSchemaName(&amp;quot;MI_ESQUEMA&amp;quot;)&lt;br /&gt;
                                                   .execute(mapIn);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pocho</name></author>	</entry>

	</feed>