<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Justo Aguilar &#187; webservices</title>
	<atom:link href="http://blog.justoaguilar.com/tag/webservices/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.justoaguilar.com</link>
	<description>Libros, Java y lo que surja.</description>
	<lastBuildDate>Sun, 22 Jan 2012 14:26:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Particularidades de Java2WSDL en Axis</title>
		<link>http://blog.justoaguilar.com/2008/08/particularidades-de-java2wsdl-en-axis/</link>
		<comments>http://blog.justoaguilar.com/2008/08/particularidades-de-java2wsdl-en-axis/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 20:15:27 +0000</pubDate>
		<dc:creator>justo</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[axis]]></category>
		<category><![CDATA[axis2]]></category>
		<category><![CDATA[java2wsdl]]></category>
		<category><![CDATA[webservices]]></category>
		<category><![CDATA[wsdl]]></category>
		<category><![CDATA[wsdl2java]]></category>

		<guid isPermaLink="false">http://blog.justoaguilar.com/?p=112</guid>
		<description><![CDATA[Hace un par de semana me estuve peleando con los scripts de Axis que permiten crear documento WSDL a partir de una clase Java, Java2WSDL y viceversa, generar el skeleton o stub Java a partir de un documento WSDL, WSDL2Java. Particularmente la herramienta java2wsdl tiene ciertos detalles que pueden llegar a ser molestos si no [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<!--INFOLINKS_ON-->
<p><p>Hace un par de semana me estuve peleando con los scripts de Axis que permiten crear documento <a href="http://es.wikipedia.org/wiki/WSDL">WSDL</a> a partir de una clase Java, <em><a href="http://ws.apache.org/axis/java/user-guide.html#Java2WSDLBuildingWSDLFromJava">Java2WSDL</a></em> y viceversa, generar el <em>skeleton</em> o <em>stub</em> Java a partir de un documento WSDL, <em><a href="http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL">WSDL2Java</a></em>. Particularmente la herramienta <em>java2wsdl</em> tiene ciertos detalles que pueden llegar a ser molestos si no se sabe como abordarlos. A continuación os cuento los problemas que tuve y las soluciones que adopté.</p>
<p>&nbsp;</p>
<p><strong>1. WSDL es un <a href="http://www.w3.org/TR/wsdl">estándar web</a></strong>.<br />
La afirmación anterior implica que la información que puede contener este documento debe ser independiente de cualquier plataforma, arquitectura, sistema operativo o lenguaje de programación, por tanto, en la sección donde se define los tipos <code><types>...</types></code> <em>no puede haber</em> referencia a ningún tipo específico Java, tal como <em>List, ArrayList, Map, &#8230;</em>.</p>
<p><strong>Solución:</strong><br />
Cualquier método que quiera ser publicado a través de un servicio web debe tener como parámetros de entrada y/o salida, tipos estándares, esto es en Java, tipos primitivos, arrays u objetos propios serializables que contengan tipos estándares.</p>
<p><strong>Ejemplo</strong><br />
Supongamos que tenemos una clase <code>Foo</code> que queremos publicar como servicio web y que contiene un tipo no estándar, por ejemplo una Lista.</p>
<pre class="brush: java; title: ; notranslate">
public class Foo {
  private List&lt;String&gt; lstStrings;

  public List&lt;String&gt; getLstStrings() {
    return this.lstStrings;
  }

  public void setLstStrings(List&lt;String&gt; lstStrings){
    this.lstStrings = lstStrings;
  }
  ...
}
</pre>
<p>Bien, pues si queremos que la herramienta <code>java2wsdl</code> genere un documento <code>WSDL</code> correcto debemos transformar el código anterior en el siguiente:</p>
<pre class="brush: java; title: ; notranslate">
public class Foo {
  private List&lt;String&gt; lstStrings;
  private String[] arrayStrings;     // Según la versión de axis, es necesario declararlo o no

  public List&lt;String&gt; getLstStrings() {
    return this.lstStrings;
  }

  public void setLstStrings(List&lt;String&gt; lstStrings) {
    this.lstStrings = lstStrings;
  } 

  public String[] getArrayStrings() {
    if ( getLstStrings() != null ) {
      return getLstStrings().toArray(new String[getLstStrings().size()]);
    }
    return new String[0];
  }

  public void setArrayStrings(String[] arrayStrings) {
    this.setArrayStrings(Arrays.asList(arrayStrings));
  }
  ...
}
</pre>
<p>&nbsp;</p>
<p><strong>2. No están soportados los modelos de datos con clases internas</strong>.<br />
Actualmente el script no genera correctamente el conjunto de tipos del documento <code>WSDL</code> si el método de la clase a publicar contiene parametros cuyos tipos sean clases internas.</p>
<p>Este error es debido a un fallo en el jar <em>annogen-0.1.0</em>; existe un <a href="http://blogs.deepal.org/2008/02/axis2-pojo-with-inner-classes-are.html">parche oficioso</a> que genera el <code>WSDL</code> correctamente pero si usamos <code>wsdl2java</code> para generar el cliente, la invocación al servicio dará un fallo.</p>
<p><strong>Solución:</strong</p>
<ol>
<li>Sacar las clases internas de la clase del servicio.</li>
<li>Utilizar el <a href="http://people.apache.org/%7Edeepal/m2repo/">jar</a> <em>oficioso</em> de Deepal Jayasinghe y crear el stub sin utilizar WSDL2Java.</li>
</ol>
<p>&nbsp;</p>
<p><strong>3. Nuestro servicio lanza una excepción.</strong><br />
Siempre que nuestro servicio lanza una <code>Exception</code> la herramienta <code>java2wsdl</code> intenta mapear el tipo de la excepción a un tipo <code>WSDL</code>. Esto siempre produce el código :</p>
<pre class="brush: xml; title: ; notranslate">
...
&lt;xs:complexType name=&quot;MyException&quot;&gt;
  &lt;xs:complexContent&gt;
    &lt;xs:extension base=&quot;xs:Exception&quot; /&gt;
    &lt;!-- o &lt;xs:extension base=&quot;xs:RuntimeException&quot; /&gt; --&gt;
    &lt;xs:sequence /&gt;
  &lt;/xs:complexContent&gt;
&lt;/xs:complexType&gt;
...
</pre>
<p>Al final <code>java2wsdl</code> busca la clase padre de la que extiende nuestra <code>exception</code> para mapearla según la semántica que permite <code>WSDL</code>, sin embargo, ni <code>xs:Exception</code> ni <code>xs:RuntimeException</code> existen como tipo estándares de <code>XML-Schema</code> lo que provoca la existerncia de warnings/errores de los editores XML que validan los documentos. </p>
<p><strong>Solución:</strong<br />
La única solución que he encontrado es hacer el siguiente cambio :</p>
<pre class="brush: xml; title: ; notranslate">
&#8230;
&lt;xs:complexType name=&quot;MyException&quot;&gt;
  &lt;xs:complexContent&gt;
    &lt;xs:extension base=&quot;xs:anyType&quot; /&gt;
    &lt;!&#8211; o &lt;xs:extension base=&quot;xs:anyType&quot; /&gt; &#8211;&gt;
    &lt;xs:sequence /&gt;
  &lt;/xs:complexContent&gt;
&lt;/xs:complexType&gt;
&#8230;
</pre>
<p>Eso si, si se genera un cliente a partir de este documento <code>WSDL</code> se deberán modificar las clases asociadas a las excepciones para que extiendan de <code>RuntimeException</code> o <code>Exception</code> o cualquier otra.</p>
<p>&nbsp;</p>
<p><strong>4. &lt;soap12:fault /&gt;</strong>.<br />
Cuando se crea un documento <code>WSDL</code> para que pueda ser utilizado por las dos versiones de <code><a href="http://www.w3.org/TR/soap/">SOAP</a></code> existentes, 1.1 y 1.2, la parte del binding de <code>SOAP 1.2</code> es incorrecta.</p>
<p>La herramienta <code>java2wsdl</code> genera un código tal como este : </p>
<pre class="brush: xml; title: ; notranslate">
...
&lt;wsdl:binding...&gt;
  &lt;soap12:opertation ... /&gt;
  &lt;wsdl:operation ...&gt;
    ...
    &lt;wsdl:fault ...&gt;
      &lt;soap12:fault use=&quot;literal&quot; name=&quot;MyException&quot; /&gt;
    &lt;/wsdl:fault&gt;
  &lt;/wsdl:operation&gt;
&lt;/wsdl:binding&gt;
...
</pre>
<p>pues el código anterior falla, el elemento <code>&lt;soap12:fault use="literal" name="MyException" /&gt;</code> no es correcto y, por ejemplo, la herramient <code>wsdl2java</code> no puede crear un cliente correcto a partir del <code>WSDL</code> </p>
<p><strong>Solución:</strong<br />
Cambiar <code>&lt;soap12:fault use="literal" name="MyException" /&gt;</code> por <code>&lt;soap:fault use="literal" name="MyException" /&gt;</code></p>
<p>&nbsp;</p>
<p>Si habéis tenido problemas parecidos y los habéis resuelto de una forma distinta a la mía, por favor, no dudéís es compartirlo para que todos salgamos ganando.</p>
<p>&nbsp;</p>

<!--INFOLINKS_OFF-->
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://blog.justoaguilar.com/2008/08/particularidades-de-java2wsdl-en-axis/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

