<?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; axis</title>
	<atom:link href="http://blog.justoaguilar.com/tag/axis/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>
		<item>
		<title>Configurar Axis 2 + Spring 2 + Weblogic 9.2</title>
		<link>http://blog.justoaguilar.com/2008/07/configurar-axis-2-spring-2-weblogic-92/</link>
		<comments>http://blog.justoaguilar.com/2008/07/configurar-axis-2-spring-2-weblogic-92/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 16:54:04 +0000</pubDate>
		<dc:creator>justo</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[axis]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[weblogic]]></category>

		<guid isPermaLink="false">http://blog.justoaguilar.com/?p=45</guid>
		<description><![CDATA[Aunque existen en la red muchos posts acerca de este tipo de configuración, no hay ninguno, que yo haya leído, que explique todo el proceso de forma sencilla. Este es el propósito de este post, describir de una manera cercana la configuración de Axis 2 para que use el contexto de Spring todo ello sobre [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<!--INFOLINKS_ON-->
<p><p>Aunque existen en la red muchos <em>posts</em> acerca de este tipo de configuración, no hay ninguno, que yo haya leído, que explique todo el proceso de forma sencilla. Este es el propósito de este post, describir de una manera cercana la configuración de <em>Axis 2</em> para que use el contexto de <em>Spring</em> todo ello sobre el servidor <em>Weblogic 9.2</em>.</p>
<p>Antes de empezar a describir todos los detalles de la configuración vamos a intentar explicar el porqué de ésta, particularmente la interacción entre <em>Axis</em> y <em>Spring</em>.</p>
<p><strong>Sin <em>Spring</em></strong></p>
<p>Supongamos que en nuestra aplicación no usamos <em>Spring</em>, el fichero <em>service.xml </em>de un servicio de <em>Axis</em> sería como sigue:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;service name=&quot;ServicioWebSinSpring&quot;&gt;
  &lt;parameter name=&quot;ServiceClass&quot;&gt;
    com.jmaguilar.springaxisweblogic.ws.services.ServicioWebSinSpring
  &lt;/parameter&gt;
  &lt;operation name=&quot;saluda&quot;&gt;
    &lt;messageReceiver class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot;/&gt;
  &lt;/operation&gt;
&lt;/service&gt;
</pre>
<p>En el código anterior se indica que el servicio web tiene el nombre de <em>ServicioWebSinSpring</em>, está asociado a la clase <code>com.jmaguilar.springaxisweblogic.ws.services.ServicioWebSinSpring</code> y tiene publicado el método <em>saluda</em>. Simple.</p>
<p><strong>Con <em>Spring</em></strong></p>
<p>Ahora la cosa cambia, <em>Axis</em> no debería poder instanciar la clase del servicio que va a usar, sino que debe solicitarla a <em>Spring</em> para que le proporcione la instancia ya creada y configurada previamente, de forma declarativa, a través del <em>applicationContext-manager.xml</em>.</p>
<p>En primer lugar vamos a ver el fichero de configuración de <em>Spring</em>.</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
            xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
            xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&quot;&gt;

  &lt;bean id=&quot;applicationContext&quot; class=&quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&quot; /&gt;
  &lt;bean id=&quot;servicioWebConSpring&quot; class=&quot; com.jmaguilar.springaxisweblogic.ws.services.ServicioWebConSpring&quot; /&gt;
&lt;/beans&gt;
</pre>
<p>El fichero define dos <em>beans</em>, <em>applicationContext</em> y <em>servicioWebConSpring</em>. El primero de ellos será utilizado por el motor de <em>Axis</em> para recuperar el <em>applicationContext </em>y, a partir de él, extraer cualquier <em>bean </em>ahí definido. Si hemos leido con atención el código nos habrá llamado la atención la clase asociada a este <em>bean</em>, <code>ApplicationContextHolder </code>se  encuentra en el <em>jar axis2-spring-x.y</em>, que viene en el fuente de <em>Axis</em>. El segundo <em>bean</em>, <em>servicioWebConSpring</em>, es nuestro servicio.</p>
<p>Para indicar al motor de <em>Axis</em> que debe recuperar el <em>bean servicioWebConSpring</em> se debe incluir el siguiente código en el fichero <em>service.xml</em> del nuestro servicio web.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;service name=&quot;ServicioWebConSpring&quot;&gt;
  &lt;parameter name=&quot;ServiceObjectSupplier&quot; locked=&quot;false&quot;&gt;org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&lt;/parameter&gt;
  &lt;parameter name=&quot;SpringBeanName&quot; locked=&quot;false&quot;&gt;servicioWebConSpring&lt;/parameter&gt;
  &lt;operation name=&quot;saluda&quot;&gt;
    &lt;messageReceiver class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot;/&gt;
  &lt;/operation&gt;
&lt;/service&gt;
</pre>
<p>En este caso, dentro del fichero <em>service.xml</em> se indica mediante el parámetro <em>ServiceObjectSupplier</em> la clase que proporcionará los objetos de servicio, <code>SpringAppContextAwareObjectSupplier</code> que también está dentro del <em>jar</em> <em>axis2-spring-x.y</em>. A través del parámetro <em>SpringBeanName</em> se especifica el <em>bean</em> que actuará como servicio, <em>ojo se debe especifica el nombre del bean, no su clase</em>. Y, por último, se indican las operaciones disponibles.</p>
<p><strong>Weblogic 9.2</strong></p>
<p>Sólo faltan por ultimar los detalles para que el despliegue en <em>Weblogic</em> sea correcto.</p>
<p><em>web.xml</em></p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE web-app PUBLIC &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot; &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot; &gt;
&lt;web-app&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
    &lt;param-value&gt;&lt;!-- indica los ficheros que contienen los beans a inyectar --&gt;
      classpath*:applicationContext-manager.xml
    &lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;listener&gt;&lt;!-- permite la inyeccion de los beans definidos ficheros indicados anteriormente --&gt;
    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
  &lt;/listener&gt;

  &lt;!-- AXIS 2 Configuration --&gt;
  &lt;servlet&gt;
    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.apache.axis2.transport.http.AxisServlet&lt;/servlet-class&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
  &lt;/servlet&gt;

  &lt;servlet-mapping&gt;
    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;

  ...

&lt;/web-app&gt;
</pre>
<p>Debido a que el servidor de <em>BEA</em> tiene una implementación propia del <em>pull-parser StAX</em> es necesario, para el correcto funcionamiento de <em>Axis</em>, tirar de los <em>jars</em> que vienen incluidos en la distribución de <em>Axis</em>. Para ello es necesario indicar a <em>Weblogic</em> que la preferencia en el <em>classpath</em> es para los <em>jars </em>contenidos en el directorio <em>WEB-INF/lib</em>, ésto se hace a través del fichero <em>weblogic.xml</em> que debe situarse bajo <em>WEB-INF</em>.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;weblogic-web-app xmlns=&quot;http://www.bea.com/ns/weblogic/90&quot;&gt;
  &lt;container-descriptor&gt;
    &lt;prefer-web-inf-classes&gt;true&lt;/prefer-web-inf-classes&gt;
  &lt;/container-descriptor&gt;
&lt;/weblogic-web-app&gt;
</pre>

<!--INFOLINKS_OFF-->
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://blog.justoaguilar.com/2008/07/configurar-axis-2-spring-2-weblogic-92/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

