<?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=Esteban</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=Esteban"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/Esteban"/>
		<updated>2026-04-05T23:14:57Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_CXF_para_Weblogic&amp;diff=4687</id>
		<title>Web Service con CXF para Weblogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_CXF_para_Weblogic&amp;diff=4687"/>
				<updated>2010-02-19T19:37:37Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Recursos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Desarrollar un servicio CXF en Weblogic es posible, si bien son necesarias algunas consideraciones.&lt;br /&gt;
&lt;br /&gt;
== Pasos ==&lt;br /&gt;
&lt;br /&gt;
==== Incluir el proyecto Web dentro de un EAR ====&lt;br /&gt;
&lt;br /&gt;
Esto es debido a que debe priorizarse el uso de ciertas clases paquetizadas con CXF.&lt;br /&gt;
Esto se hace incluyendo el siguiente código en el archivo weblogic-application.xml&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;prefer-application-packages&amp;gt;&lt;br /&gt;
        &amp;lt;package-name&amp;gt;javax.jws.*&amp;lt;/package-name&amp;gt;&lt;br /&gt;
    &amp;lt;/prefer-application-packages&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Eliminar referencias al filesystem ====&lt;br /&gt;
&lt;br /&gt;
Por default, el proceso de generación de código escribe ciertas referencias al fylesystem. Dado que Weblogic no descomprime los ejecutables, no puede obtener las referencias del sistema de archivos. Es por ello que deberemos remover dichas referencias de las clases *Service.java y *Impl.java&lt;br /&gt;
Ej:&lt;br /&gt;
&lt;br /&gt;
    @WebServiceClient(name = &amp;quot;CalculadoraService&amp;quot;, &lt;br /&gt;
                      wsdlLocation = &amp;quot;'''CalculadoraService.wsdl'''&amp;quot;,&lt;br /&gt;
                      targetNamespace = &amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;) &lt;br /&gt;
    public class CalculadoraService extends Service {&lt;br /&gt;
        &lt;br /&gt;
        public final static URL WSDL_LOCATION;&lt;br /&gt;
        public final static QName SERVICE = new QName(&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;, &amp;quot;CalculadoraService&amp;quot;);&lt;br /&gt;
        public final static QName CalculadoraSoapPort = new QName(&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;, &amp;quot;CalculadoraSoapPort&amp;quot;);&lt;br /&gt;
        static {&lt;br /&gt;
            URL url = null;&lt;br /&gt;
            try {&lt;br /&gt;
                url = new URL(&amp;quot;'''CalculadoraService.wsdl'''&amp;quot;);&lt;br /&gt;
            } catch (MalformedURLException e) {&lt;br /&gt;
                System.err.println(&amp;quot;Can not initialize the default wsdl from file:./src/java/CalculadoraService.wsdl&amp;quot;);&lt;br /&gt;
                // e.printStackTrace();&lt;br /&gt;
            }&lt;br /&gt;
            WSDL_LOCATION = url;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Copiar WSDL a la carpeta WEB-INF ====&lt;br /&gt;
&lt;br /&gt;
Como la carpeta WEB-INF si se descomprime, WL toma además las referencias relativas de los archivos respecto de esa carpeta, por lo que si se especifica el nombre del archivo a secas, lo CXF lo irá a buscar a ese carpeta.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
[http://www.dosideas.com/descargas/category/8.html?download=35%3Ap-p-l Proyecto Ejemplo Java 1.5 y CXF 2.2.6 para Weblogic]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Creaci%C3%B3n_de_un_Servicio_Web_partiendo_de_un_WSDL_con_Apache_CXF&amp;diff=4686</id>
		<title>Creación de un Servicio Web partiendo de un WSDL con Apache CXF</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Creaci%C3%B3n_de_un_Servicio_Web_partiendo_de_un_WSDL_con_Apache_CXF&amp;diff=4686"/>
				<updated>2010-02-19T19:36:27Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Proyecto de ejemplo para descargar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre CXF para el proyecto.&lt;br /&gt;
==== Agregar la librería CXF al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://cxf.apache.org/download.html). Para este proyecto se utilizó la última versión al momento, que es la 2.2.6&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. Las libreria de Geronimo no son necesarias para un despliegue en Tomcat, así como las de Jetty, Jettyson y XMLBeans.&lt;br /&gt;
Dentro del conjunto de librerias se incluye Spring 2.5.6, ya que usa CXF usa intensivamente dicho framework.&lt;br /&gt;
&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
Dicho archivo lo copiaremos a la raiz del directorio de fuentes.&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
CXF, como también Axis 2, viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso construiremos una tarea Ant para construir dichas clases.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;path id=&amp;quot;cxf.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;./lib/CXF-2.2.6&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;include name=&amp;quot;*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;target name=&amp;quot;create server side classes&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt; java classname=&amp;quot;org.apache.cxf.tools.wsdlto.WSDLToJava&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-server&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-validate&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-impl&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-d&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;./src/java/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classpath&amp;gt;&lt;br /&gt;
                &amp;lt;path refid=&amp;quot;cxf.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/classpath&amp;gt;&lt;br /&gt;
        &amp;lt; /java&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;target name=&amp;quot;create client side classes&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt; java classname=&amp;quot;org.apache.cxf.tools.wsdlto.WSDLToJava&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-client&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-validate&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-p&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;test.dosideas.com&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-d&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;test&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;./src/java/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classpath&amp;gt;&lt;br /&gt;
                &amp;lt;path refid=&amp;quot;cxf.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/classpath&amp;gt;&lt;br /&gt;
        &amp;lt; /java&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se definen 2 tareas: la primera para crear las clases del lado servidor y la segunda para crear las clases del cliente. Cabe notar que a esta última le pasamos un package de parámetro. Esto es para evitar el clashing de clases entre la parte cliente y la parte servidora.&lt;br /&gt;
En ambos casos estas tareas Ant generarán las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ====&lt;br /&gt;
&lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Impl (CalculadoraImpl), la cual a su vez llamará a un objeto de negocio.&lt;br /&gt;
&lt;br /&gt;
    @javax.jws.WebService(&lt;br /&gt;
                          serviceName = &amp;quot;CalculadoraService&amp;quot;,&lt;br /&gt;
                          portName = &amp;quot;CalculadoraSoapPort&amp;quot;,&lt;br /&gt;
                          targetNamespace = &amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;,&lt;br /&gt;
                          wsdlLocation = &amp;quot;file:./src/java/CalculadoraService.wsdl&amp;quot;,&lt;br /&gt;
                          endpointInterface = &amp;quot;com.dosideas.cursos.calculadora.Calculadora&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    public class CalculadoraImpl implements Calculadora {&lt;br /&gt;
        private static final Logger LOG = Logger.getLogger(CalculadoraImpl.class.getName());&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public com.dosideas.cursos.calculadora.DivisionRespuesta dividir(DivisionSolicitud parameters) throws DivisionPorCero    { &lt;br /&gt;
            LOG.info(&amp;quot;Executing operation dividir&amp;quot;);&lt;br /&gt;
            System.out.println(parameters);&lt;br /&gt;
            try {&lt;br /&gt;
                int dividendo = parameters.getDividendo();&lt;br /&gt;
                int divisor = parameters.getDivisor();&lt;br /&gt;
                int cociente = calculadoraBo.dividir(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.resto(dividendo, divisor);&lt;br /&gt;
                com.dosideas.cursos.calculadora.DivisionRespuesta _return = new DivisionRespuesta();&lt;br /&gt;
                _return.setCociente(cociente);&lt;br /&gt;
                _return.setResto(resto);&lt;br /&gt;
                return _return;&lt;br /&gt;
            } catch (ArithmeticException ex) {&lt;br /&gt;
                /* Hay que completar todos los datos de la excepción de negocio */&lt;br /&gt;
                DivisionPorCero divisionPorCero = new DivisionPorCero(&amp;quot;DivisionPorCeroError&amp;quot;, &amp;quot;DivisionPorCeroError&amp;quot;);&lt;br /&gt;
                throw divisionPorCero;&lt;br /&gt;
            } catch (Exception ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
                throw new RuntimeException(ex);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public com.dosideas.cursos.calculadora.SumaRespuesta sumar(SumaSolicitud parameters) { &lt;br /&gt;
            LOG.info(&amp;quot;Executing operation sumar&amp;quot;);&lt;br /&gt;
            System.out.println(parameters);&lt;br /&gt;
            try {&lt;br /&gt;
                com.dosideas.cursos.calculadora.SumaRespuesta _return = new SumaRespuesta();&lt;br /&gt;
                _return.setNumero(calculadoraBo.sumar(parameters.getNumero1(), parameters.getNumero2()));&lt;br /&gt;
                return _return;&lt;br /&gt;
            } catch (Exception ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
                throw new RuntimeException(ex);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf-servlet.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf-extension-soap.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraImpl&amp;quot; class=&amp;quot;com.dosideas.cursos.calculadora.CalculadoraImpl&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;jaxws:endpoint id=&amp;quot;calculadoraService&amp;quot;&lt;br /&gt;
                    address=&amp;quot;/calculadoraService&amp;quot;&lt;br /&gt;
                    wsdlLocation=&amp;quot;CalculadoraService.wsdl&amp;quot;&lt;br /&gt;
                    implementor=&amp;quot;#calculadoraImpl&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/jaxws:endpoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es aquí donde configuramos el servicio Web propiamente. Se configura la url donde estará publicado, el WSDL que implementa, y la implementación.&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;/WEB-INF/applicationContext.xml&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;!-- Servlet de CXF, mapeado al raiz --&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;CXFServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.cxf.transport.servlet.CXFServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;CXFServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
=== WSDL de Calculadora Service ===&lt;br /&gt;
&lt;br /&gt;
Existe un pequeño problema con CXF parte cliente, por que se cambió el WSDL para subsanar ese problema.&lt;br /&gt;
Dicho problema consiste en que el cliente no escribe correctamente los namespaces en los elementos del mensaje de solicitud. Este error se subsana seteando el WSDL con el atributo elementFormDefault=&amp;quot;unqualified&amp;quot; en el schema.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;wsdl:definitions  name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:calc=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;
            &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; elementFormDefault=&amp;quot;unqualified&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionPorCero&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
            &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;divisionPorCero&amp;quot; element=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input message=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output message=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot; message=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input message=&amp;quot;calc:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output message=&amp;quot;calc:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;calc:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/dividir&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:fault name=&amp;quot;divisionPorCero&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;calc:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;soap:address location=&amp;quot;http://localhost:8080/CXF/calculadoraService&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;
    &amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
==Proyecto de ejemplo para descargar==&lt;br /&gt;
&lt;br /&gt;
[http://www.dosideas.com/descargas/category/8.html?download=34%3Ap Proyecto Ejemplo con Java 1.5 y CXF 2.2.4]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Web Service con CXF para Weblogic]]&lt;br /&gt;
* [http://cxf.apache.org/ Apache CXF]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_CXF_para_Weblogic&amp;diff=4681</id>
		<title>Web Service con CXF para Weblogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_CXF_para_Weblogic&amp;diff=4681"/>
				<updated>2010-02-18T19:13:57Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Debe desplegarse dentro de un EAR */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Desarrollar un servicio CXF en Weblogic es posible, si bien son necesarias algunas consideraciones.&lt;br /&gt;
&lt;br /&gt;
== Pasos ==&lt;br /&gt;
&lt;br /&gt;
==== Incluir el proyecto Web dentro de un EAR ====&lt;br /&gt;
&lt;br /&gt;
Esto es debido a que debe priorizarse el uso de ciertas clases paquetizadas con CXF.&lt;br /&gt;
Esto se hace incluyendo el siguiente código en el archivo weblogic-application.xml&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;prefer-application-packages&amp;gt;&lt;br /&gt;
        &amp;lt;package-name&amp;gt;javax.jws.*&amp;lt;/package-name&amp;gt;&lt;br /&gt;
    &amp;lt;/prefer-application-packages&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Eliminar referencias al filesystem ====&lt;br /&gt;
&lt;br /&gt;
Por default, el proceso de generación de código escribe ciertas referencias al fylesystem. Dado que Weblogic no descomprime los ejecutables, no puede obtener las referencias del sistema de archivos. Es por ello que deberemos remover dichas referencias de las clases *Service.java y *Impl.java&lt;br /&gt;
Ej:&lt;br /&gt;
&lt;br /&gt;
    @WebServiceClient(name = &amp;quot;CalculadoraService&amp;quot;, &lt;br /&gt;
                      wsdlLocation = &amp;quot;'''CalculadoraService.wsdl'''&amp;quot;,&lt;br /&gt;
                      targetNamespace = &amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;) &lt;br /&gt;
    public class CalculadoraService extends Service {&lt;br /&gt;
        &lt;br /&gt;
        public final static URL WSDL_LOCATION;&lt;br /&gt;
        public final static QName SERVICE = new QName(&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;, &amp;quot;CalculadoraService&amp;quot;);&lt;br /&gt;
        public final static QName CalculadoraSoapPort = new QName(&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;, &amp;quot;CalculadoraSoapPort&amp;quot;);&lt;br /&gt;
        static {&lt;br /&gt;
            URL url = null;&lt;br /&gt;
            try {&lt;br /&gt;
                url = new URL(&amp;quot;'''CalculadoraService.wsdl'''&amp;quot;);&lt;br /&gt;
            } catch (MalformedURLException e) {&lt;br /&gt;
                System.err.println(&amp;quot;Can not initialize the default wsdl from file:./src/java/CalculadoraService.wsdl&amp;quot;);&lt;br /&gt;
                // e.printStackTrace();&lt;br /&gt;
            }&lt;br /&gt;
            WSDL_LOCATION = url;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Copiar WSDL a la carpeta WEB-INF ====&lt;br /&gt;
&lt;br /&gt;
Como la carpeta WEB-INF si se descomprime, WL toma además las referencias relativas de los archivos respecto de esa carpeta, por lo que si se especifica el nombre del archivo a secas, lo CXF lo irá a buscar a ese carpeta.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
==== Proyecto de ejemplo ====&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_CXF_para_Weblogic&amp;diff=4680</id>
		<title>Web Service con CXF para Weblogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_CXF_para_Weblogic&amp;diff=4680"/>
				<updated>2010-02-18T18:54:54Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Página creada con 'Desarrollar un servicio CXF en Weblogic es posible, si bien son necesarias algunas consideraciones.  == Pasos ==  ==== Debe desplegarse dentro de un EAR ====  Esto es debido a q…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Desarrollar un servicio CXF en Weblogic es posible, si bien son necesarias algunas consideraciones.&lt;br /&gt;
&lt;br /&gt;
== Pasos ==&lt;br /&gt;
&lt;br /&gt;
==== Debe desplegarse dentro de un EAR ====&lt;br /&gt;
&lt;br /&gt;
Esto es debido a que debe priorizarse el uso de ciertas clases paquetizadas con CXF.&lt;br /&gt;
Esto se hace incluyendo el siguiente código en el archivo weblogic-application.xml&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;prefer-application-packages&amp;gt;&lt;br /&gt;
        &amp;lt;package-name&amp;gt;javax.jws.*&amp;lt;/package-name&amp;gt;&lt;br /&gt;
    &amp;lt;/prefer-application-packages&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Eliminar referencias al filesystem ====&lt;br /&gt;
&lt;br /&gt;
Por default, el proceso de generación de código escribe ciertas referencias al fylesystem. Dado que Weblogic no descomprime los ejecutables, no puede obtener las referencias del sistema de archivos. Es por ello que deberemos remover dichas referencias de las clases *Service.java y *Impl.java&lt;br /&gt;
Ej:&lt;br /&gt;
&lt;br /&gt;
    @WebServiceClient(name = &amp;quot;CalculadoraService&amp;quot;, &lt;br /&gt;
                      wsdlLocation = &amp;quot;'''CalculadoraService.wsdl'''&amp;quot;,&lt;br /&gt;
                      targetNamespace = &amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;) &lt;br /&gt;
    public class CalculadoraService extends Service {&lt;br /&gt;
        &lt;br /&gt;
        public final static URL WSDL_LOCATION;&lt;br /&gt;
        public final static QName SERVICE = new QName(&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;, &amp;quot;CalculadoraService&amp;quot;);&lt;br /&gt;
        public final static QName CalculadoraSoapPort = new QName(&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;, &amp;quot;CalculadoraSoapPort&amp;quot;);&lt;br /&gt;
        static {&lt;br /&gt;
            URL url = null;&lt;br /&gt;
            try {&lt;br /&gt;
                url = new URL(&amp;quot;'''CalculadoraService.wsdl'''&amp;quot;);&lt;br /&gt;
            } catch (MalformedURLException e) {&lt;br /&gt;
                System.err.println(&amp;quot;Can not initialize the default wsdl from file:./src/java/CalculadoraService.wsdl&amp;quot;);&lt;br /&gt;
                // e.printStackTrace();&lt;br /&gt;
            }&lt;br /&gt;
            WSDL_LOCATION = url;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Copiar WSDL a la carpeta WEB-INF ====&lt;br /&gt;
&lt;br /&gt;
Como la carpeta WEB-INF si se descomprime, WL toma además las referencias relativas de los archivos respecto de esa carpeta, por lo que si se especifica el nombre del archivo a secas, lo CXF lo irá a buscar a ese carpeta.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
==== Proyecto de ejemplo ====&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Creaci%C3%B3n_de_un_Servicio_Web_partiendo_de_un_WSDL_con_Apache_CXF&amp;diff=4679</id>
		<title>Creación de un Servicio Web partiendo de un WSDL con Apache CXF</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Creaci%C3%B3n_de_un_Servicio_Web_partiendo_de_un_WSDL_con_Apache_CXF&amp;diff=4679"/>
				<updated>2010-02-18T18:10:11Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Paso a paso como configurar un proyecto con CXF&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre CXF para el proyecto.&lt;br /&gt;
==== Agregar la librería CXF al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://cxf.apache.org/download.html). Para este proyecto se utilizó la última versión al momento, que es la 2.2.6&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. Las libreria de Geronimo no son necesarias para un despliegue en Tomcat, así como las de Jetty, Jettyson y XMLBeans.&lt;br /&gt;
Dentro del conjunto de librerias se incluye Spring 2.5.6, ya que usa CXF usa intensivamente dicho framework.&lt;br /&gt;
&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
Dicho archivo lo copiaremos a la raiz del directorio de fuentes.&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
CXF, como también Axis 2, viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso construiremos una tarea Ant para construir dichas clases.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;path id=&amp;quot;cxf.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;./lib/CXF-2.2.6&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;include name=&amp;quot;*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;target name=&amp;quot;create server side classes&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt; java classname=&amp;quot;org.apache.cxf.tools.wsdlto.WSDLToJava&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-server&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-validate&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-impl&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-d&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;./src/java/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classpath&amp;gt;&lt;br /&gt;
                &amp;lt;path refid=&amp;quot;cxf.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/classpath&amp;gt;&lt;br /&gt;
        &amp;lt; /java&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;target name=&amp;quot;create client side classes&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt; java classname=&amp;quot;org.apache.cxf.tools.wsdlto.WSDLToJava&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-client&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-validate&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-p&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;test.dosideas.com&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;-d&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;test&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;arg value=&amp;quot;./src/java/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;classpath&amp;gt;&lt;br /&gt;
                &amp;lt;path refid=&amp;quot;cxf.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/classpath&amp;gt;&lt;br /&gt;
        &amp;lt; /java&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se definen 2 tareas: la primera para crear las clases del lado servidor y la segunda para crear las clases del cliente. Cabe notar que a esta última le pasamos un package de parámetro. Esto es para evitar el clashing de clases entre la parte cliente y la parte servidora.&lt;br /&gt;
En ambos casos estas tareas Ant generarán las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ====&lt;br /&gt;
&lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Impl (CalculadoraImpl), la cual a su vez llamará a un objeto de negocio.&lt;br /&gt;
&lt;br /&gt;
    @javax.jws.WebService(&lt;br /&gt;
                          serviceName = &amp;quot;CalculadoraService&amp;quot;,&lt;br /&gt;
                          portName = &amp;quot;CalculadoraSoapPort&amp;quot;,&lt;br /&gt;
                          targetNamespace = &amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;,&lt;br /&gt;
                          wsdlLocation = &amp;quot;file:./src/java/CalculadoraService.wsdl&amp;quot;,&lt;br /&gt;
                          endpointInterface = &amp;quot;com.dosideas.cursos.calculadora.Calculadora&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    public class CalculadoraImpl implements Calculadora {&lt;br /&gt;
        private static final Logger LOG = Logger.getLogger(CalculadoraImpl.class.getName());&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public com.dosideas.cursos.calculadora.DivisionRespuesta dividir(DivisionSolicitud parameters) throws DivisionPorCero    { &lt;br /&gt;
            LOG.info(&amp;quot;Executing operation dividir&amp;quot;);&lt;br /&gt;
            System.out.println(parameters);&lt;br /&gt;
            try {&lt;br /&gt;
                int dividendo = parameters.getDividendo();&lt;br /&gt;
                int divisor = parameters.getDivisor();&lt;br /&gt;
                int cociente = calculadoraBo.dividir(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.resto(dividendo, divisor);&lt;br /&gt;
                com.dosideas.cursos.calculadora.DivisionRespuesta _return = new DivisionRespuesta();&lt;br /&gt;
                _return.setCociente(cociente);&lt;br /&gt;
                _return.setResto(resto);&lt;br /&gt;
                return _return;&lt;br /&gt;
            } catch (ArithmeticException ex) {&lt;br /&gt;
                /* Hay que completar todos los datos de la excepción de negocio */&lt;br /&gt;
                DivisionPorCero divisionPorCero = new DivisionPorCero(&amp;quot;DivisionPorCeroError&amp;quot;, &amp;quot;DivisionPorCeroError&amp;quot;);&lt;br /&gt;
                throw divisionPorCero;&lt;br /&gt;
            } catch (Exception ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
                throw new RuntimeException(ex);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public com.dosideas.cursos.calculadora.SumaRespuesta sumar(SumaSolicitud parameters) { &lt;br /&gt;
            LOG.info(&amp;quot;Executing operation sumar&amp;quot;);&lt;br /&gt;
            System.out.println(parameters);&lt;br /&gt;
            try {&lt;br /&gt;
                com.dosideas.cursos.calculadora.SumaRespuesta _return = new SumaRespuesta();&lt;br /&gt;
                _return.setNumero(calculadoraBo.sumar(parameters.getNumero1(), parameters.getNumero2()));&lt;br /&gt;
                return _return;&lt;br /&gt;
            } catch (Exception ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
                throw new RuntimeException(ex);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf-servlet.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf-extension-soap.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraImpl&amp;quot; class=&amp;quot;com.dosideas.cursos.calculadora.CalculadoraImpl&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;jaxws:endpoint id=&amp;quot;calculadoraService&amp;quot;&lt;br /&gt;
                    address=&amp;quot;/calculadoraService&amp;quot;&lt;br /&gt;
                    wsdlLocation=&amp;quot;CalculadoraService.wsdl&amp;quot;&lt;br /&gt;
                    implementor=&amp;quot;#calculadoraImpl&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/jaxws:endpoint&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es aquí donde configuramos el servicio Web propiamente. Se configura la url donde estará publicado, el WSDL que implementa, y la implementación.&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;/WEB-INF/applicationContext.xml&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;!-- Servlet de CXF, mapeado al raiz --&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;CXFServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.cxf.transport.servlet.CXFServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;CXFServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
=== WSDL de Calculadora Service ===&lt;br /&gt;
&lt;br /&gt;
Existe un pequeño problema con CXF parte cliente, por que se cambió el WSDL para subsanar ese problema.&lt;br /&gt;
Dicho problema consiste en que el cliente no escribe correctamente los namespaces en los elementos del mensaje de solicitud. Este error se subsana seteando el WSDL con el atributo elementFormDefault=&amp;quot;unqualified&amp;quot; en el schema.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;wsdl:definitions  name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:calc=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;
            &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; elementFormDefault=&amp;quot;unqualified&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionPorCero&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
            &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;divisionPorCero&amp;quot; element=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input message=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output message=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot; message=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input message=&amp;quot;calc:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output message=&amp;quot;calc:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;calc:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/dividir&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:fault name=&amp;quot;divisionPorCero&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
                &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                    &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt;
        &amp;lt;wsdl:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;wsdl:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;calc:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;soap:address location=&amp;quot;http://localhost:8080/CXF/calculadoraService&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt;
        &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;
    &amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
==Proyecto de ejemplo para descargar==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Web Service con CXF para Weblogic]]&lt;br /&gt;
* [http://cxf.apache.org/ Apache CXF]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4678</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4678"/>
				<updated>2010-02-18T17:34:09Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                DivisionPorCeroException error = new DivisionPorCeroException();&lt;br /&gt;
                // En caso que no se setee el objeto descripcion, tira un error genérico AxisFault&lt;br /&gt;
                DivisionPorCero div = new DivisionPorCero();&lt;br /&gt;
                // Si no se llenan todos los campos obligatorios, devuelve error 500 de http&lt;br /&gt;
                div.setDivisionPorCero(&amp;quot;Descripcion del error&amp;quot;);&lt;br /&gt;
                error.setFaultMessage(div);&lt;br /&gt;
                throw error;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Se recomienda prestar especial atención al tratamiento de los errores custom.&lt;br /&gt;
Cada error de negocio cuenta con un tipo interno, que contiene la descripción del error. En caso de no llenar dicha descripción, se lanzará un error genérico AxisFault.&lt;br /&gt;
Además hay que tener especial cuidado al llenar dicha descripción. En caso que no se cumpla con el formato, Axis devuelve un error http 500, en vez de un error descriptivo.&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==== Sugerencias para la construcción del WSDL ====&lt;br /&gt;
&lt;br /&gt;
* No utilizar las palabras Error o Exception al final de los tipos o de los mensajes Fault. Estas palabras son utilizadas por el generador de código, por lo que luego el código generado será incorrecto.&lt;br /&gt;
* Si se usa la versión 1.4 de Axis 2, no nombrar de la misma forma un mensaje de error que el tipo que contiene. Genera un error extraño en el generador de código, por el que genera 2 excepciones con el nombre del mensaje. Ej: Con el tipo DivisionPorCero, generó DivisionPorCeroException0 y DivisionPorCeroException1.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
=== WSDL de Calculadora Service ===&lt;br /&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;
   &amp;lt;wsdl:definitions name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:calc=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;
           &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; elementFormDefault=&amp;quot;qualified&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionPorCero&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;divisionPorCero&amp;quot; element=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot; message=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;calc:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;soap:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:fault name=&amp;quot;divisionPorCero&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;calc:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:address location=&amp;quot;http://localhost:8080/Axis2-15/services/CalculadoraService&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;
   &amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;
==Proyectos de ejemplo para descargar==&lt;br /&gt;
Aquí que te podés descargar 2 versiones del proyecto&lt;br /&gt;
&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/8-.html?download=32%3A2-1.4.1-p-1.4 Axis2 1.4.1 para JDK 1.4]&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/8-.html?download=33%3A2-1.5.1-p-5 Axis2 1.5.1 para JDK 5]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_CXF&amp;diff=4677</id>
		<title>Apache CXF</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_CXF&amp;diff=4677"/>
				<updated>2010-02-18T17:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
=== Construcción de un servicio y su cliente con cxf ===&lt;br /&gt;
La noticia [http://www.dosideas.com/noticias/java/396-servicios-web-con-apache-cxf.html Servicios web con Apache CXF] da una introducción a cxf, explica cómo crear un [[Web Service]] con Apache CXF y también la creación de un cliente que lo consuma.&lt;br /&gt;
&lt;br /&gt;
=== Apache CXF y WebLogic 9.2 ===&lt;br /&gt;
Deployar una aplicación que utiliza Apache CXF en [[WebLogic]] 9.2 provoca un conflicto de versiones de las librerías de jax-ws. Para solucionarlo, el archivo ''weblogic-application.xml'' debe contener lo siguiente:&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;
&amp;lt;weblogic-application xmlns=&amp;quot;http://www.bea.com/ns/weblogic/90&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;!-- Necesario para evitar conflictos de los jar de jax-ws con los que &lt;br /&gt;
   tiene el jar de weblogic --&amp;gt;&lt;br /&gt;
   &amp;lt;prefer-application-packages&amp;gt;&lt;br /&gt;
       &amp;lt;package-name&amp;gt;org.apache.xerces.*&amp;lt;/package-name&amp;gt;&lt;br /&gt;
       &amp;lt;package-name&amp;gt;javax.jws.*&amp;lt;/package-name&amp;gt;&lt;br /&gt;
   &amp;lt;/prefer-application-packages&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;/weblogic-application&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta manera indicamos a weblogic que debe dar prioridad a las clases contenidas en el jar de jax-ws provisto por la aplicación, por sobre la versión de esas mismas clases q están contenidas en el weblogic.jar.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [http://www.dosideas.com/java/396-servicios-web-con-apache-cxf.html Servicios web con Apache CXF]&lt;br /&gt;
* [[Creación de un Servicio Web partiendo de un WSDL con Apache CXF]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4671</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4671"/>
				<updated>2010-02-17T17:23:32Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Descargas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
[[WSDL de Servicio Calculadora]]&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                DivisionPorCeroException error = new DivisionPorCeroException();&lt;br /&gt;
                // En caso que no se setee el objeto descripcion, tira un error genérico AxisFault&lt;br /&gt;
                DivisionPorCero div = new DivisionPorCero();&lt;br /&gt;
                // Si no se llenan todos los campos obligatorios, devuelve error 500 de http&lt;br /&gt;
                div.setDivisionPorCero(&amp;quot;Descripcion del error&amp;quot;);&lt;br /&gt;
                error.setFaultMessage(div);&lt;br /&gt;
                throw error;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Se recomienda prestar especial atención al tratamiento de los errores custom.&lt;br /&gt;
Cada error de negocio cuenta con un tipo interno, que contiene la descripción del error. En caso de no llenar dicha descripción, se lanzará un error genérico AxisFault.&lt;br /&gt;
Además hay que tener especial cuidado al llenar dicha descripción. En caso que no se cumpla con el formato, Axis devuelve un error http 500, en vez de un error descriptivo.&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==== Sugerencias para la construcción del WSDL ====&lt;br /&gt;
&lt;br /&gt;
* No utilizar las palabras Error o Exception al final de los tipos o de los mensajes Fault. Estas palabras son utilizadas por el generador de código, por lo que luego el código generado será incorrecto.&lt;br /&gt;
* Si se usa la versión 1.4 de Axis 2, no nombrar de la misma forma un mensaje de error que el tipo que contiene. Genera un error extraño en el generador de código, por el que genera 2 excepciones con el nombre del mensaje. Ej: Con el tipo DivisionPorCero, generó DivisionPorCeroException0 y DivisionPorCeroException1.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
=== WSDL de Calculadora Service ===&lt;br /&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;
   &amp;lt;wsdl:definitions name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:calc=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;
           &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; elementFormDefault=&amp;quot;qualified&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionPorCero&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;divisionPorCero&amp;quot; element=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot; message=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;calc:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;soap:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:fault name=&amp;quot;divisionPorCero&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;calc:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:address location=&amp;quot;http://localhost:8080/Axis2-15/services/CalculadoraService&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;
   &amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;
==Descargas==&lt;br /&gt;
&lt;br /&gt;
Aquí que te puedes descargar 2 versiones del proyecto&lt;br /&gt;
&lt;br /&gt;
[http://www.dosideas.com/descargas/category/8-.html?download=32%3A2-1.4.1-p-1.4 Axis2 1.4.1 para JDK 1.4 (18.94 MB)]&lt;br /&gt;
&lt;br /&gt;
[http://www.dosideas.com/descargas/category/8-.html?download=33%3A2-1.5.1-p-5 Axis2 1.5.1 para JDK 5 (20.08 MB)]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4670</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4670"/>
				<updated>2010-02-17T17:23:15Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Se agregaron los links de descarga al proyecto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
[[WSDL de Servicio Calculadora]]&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                DivisionPorCeroException error = new DivisionPorCeroException();&lt;br /&gt;
                // En caso que no se setee el objeto descripcion, tira un error genérico AxisFault&lt;br /&gt;
                DivisionPorCero div = new DivisionPorCero();&lt;br /&gt;
                // Si no se llenan todos los campos obligatorios, devuelve error 500 de http&lt;br /&gt;
                div.setDivisionPorCero(&amp;quot;Descripcion del error&amp;quot;);&lt;br /&gt;
                error.setFaultMessage(div);&lt;br /&gt;
                throw error;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Se recomienda prestar especial atención al tratamiento de los errores custom.&lt;br /&gt;
Cada error de negocio cuenta con un tipo interno, que contiene la descripción del error. En caso de no llenar dicha descripción, se lanzará un error genérico AxisFault.&lt;br /&gt;
Además hay que tener especial cuidado al llenar dicha descripción. En caso que no se cumpla con el formato, Axis devuelve un error http 500, en vez de un error descriptivo.&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==== Sugerencias para la construcción del WSDL ====&lt;br /&gt;
&lt;br /&gt;
* No utilizar las palabras Error o Exception al final de los tipos o de los mensajes Fault. Estas palabras son utilizadas por el generador de código, por lo que luego el código generado será incorrecto.&lt;br /&gt;
* Si se usa la versión 1.4 de Axis 2, no nombrar de la misma forma un mensaje de error que el tipo que contiene. Genera un error extraño en el generador de código, por el que genera 2 excepciones con el nombre del mensaje. Ej: Con el tipo DivisionPorCero, generó DivisionPorCeroException0 y DivisionPorCeroException1.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
=== WSDL de Calculadora Service ===&lt;br /&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;
   &amp;lt;wsdl:definitions name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:calc=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;
           &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; elementFormDefault=&amp;quot;qualified&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionPorCero&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;divisionPorCero&amp;quot; element=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot; message=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;calc:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;soap:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:fault name=&amp;quot;divisionPorCero&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;calc:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:address location=&amp;quot;http://localhost:8080/Axis2-15/services/CalculadoraService&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;
   &amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;
==Descargas==&lt;br /&gt;
&lt;br /&gt;
Aquí que te puedes descargar 2 versiones del proyecto&lt;br /&gt;
&lt;br /&gt;
[http://www.dosideas.com/descargas/category/8-.html?download=32%3A2-1.4.1-p-1.4 Axis2 1.4.1 para JDK 1.4 (18.94 MB)]&lt;br /&gt;
[http://www.dosideas.com/descargas/category/8-.html?download=33%3A2-1.5.1-p-5 Axis2 1.5.1 para JDK 5 (20.08 MB)]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4654</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4654"/>
				<updated>2010-02-16T20:44:42Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Sugerencias para la construcción del WSDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
[[WSDL de Servicio Calculadora]]&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                DivisionPorCeroException error = new DivisionPorCeroException();&lt;br /&gt;
                // En caso que no se setee el objeto descripcion, tira un error genérico AxisFault&lt;br /&gt;
                DivisionPorCero div = new DivisionPorCero();&lt;br /&gt;
                // Si no se llenan todos los campos obligatorios, devuelve error 500 de http&lt;br /&gt;
                div.setDivisionPorCero(&amp;quot;Descripcion del error&amp;quot;);&lt;br /&gt;
                error.setFaultMessage(div);&lt;br /&gt;
                throw error;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Se recomienda prestar especial atención al tratamiento de los errores custom.&lt;br /&gt;
Cada error de negocio cuenta con un tipo interno, que contiene la descripción del error. En caso de no llenar dicha descripción, se lanzará un error genérico AxisFault.&lt;br /&gt;
Además hay que tener especial cuidado al llenar dicha descripción. En caso que no se cumpla con el formato, Axis devuelve un error http 500, en vez de un error descriptivo.&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==== Sugerencias para la construcción del WSDL ====&lt;br /&gt;
&lt;br /&gt;
* No utilizar las palabras Error o Exception al final de los tipos o de los mensajes Fault. Estas palabras son utilizadas por el generador de código, por lo que luego el código generado será incorrecto.&lt;br /&gt;
* Si se usa la versión 1.4 de Axis 2, no nombrar de la misma forma un mensaje de error que el tipo que contiene. Genera un error extraño en el generador de código, por el que genera 2 excepciones con el nombre del mensaje. Ej: Con el tipo DivisionPorCero, generó DivisionPorCeroException0 y DivisionPorCeroException1.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
=== WSDL de Calculadora Service ===&lt;br /&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;
   &amp;lt;wsdl:definitions name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:calc=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;
           &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; elementFormDefault=&amp;quot;qualified&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionPorCero&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;divisionPorCero&amp;quot; element=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot; message=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;calc:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;soap:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:fault name=&amp;quot;divisionPorCero&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;calc:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:address location=&amp;quot;http://localhost:8080/Axis2-15/services/CalculadoraService&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;
   &amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[WSDL de CalculadoraService]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4652</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4652"/>
				<updated>2010-02-16T20:04:05Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Se incluyo el WSDL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
[[WSDL de Servicio Calculadora]]&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                DivisionPorCeroException error = new DivisionPorCeroException();&lt;br /&gt;
                // En caso que no se setee el objeto descripcion, tira un error genérico AxisFault&lt;br /&gt;
                DivisionPorCero div = new DivisionPorCero();&lt;br /&gt;
                // Si no se llenan todos los campos obligatorios, devuelve error 500 de http&lt;br /&gt;
                div.setDivisionPorCero(&amp;quot;Descripcion del error&amp;quot;);&lt;br /&gt;
                error.setFaultMessage(div);&lt;br /&gt;
                throw error;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Se recomienda prestar especial atención al tratamiento de los errores custom.&lt;br /&gt;
Cada error de negocio cuenta con un tipo interno, que contiene la descripción del error. En caso de no llenar dicha descripción, se lanzará un error genérico AxisFault.&lt;br /&gt;
Además hay que tener especial cuidado al llenar dicha descripción. En caso que no se cumpla con el formato, Axis devuelve un error http 500, en vez de un error descriptivo.&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==== Sugerencias para la construcción del WSDL ====&lt;br /&gt;
&lt;br /&gt;
* No utilizar las palabras Error o Exception al final de los tipos o de los mensajes Fault. Estas palabras son utilizadas por el generador de código, por lo que luego el código generado será incorrecto.&lt;br /&gt;
&lt;br /&gt;
== Recursos ==&lt;br /&gt;
&lt;br /&gt;
=== WSDL de Calculadora Service ===&lt;br /&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;
   &amp;lt;wsdl:definitions name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:calc=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:types&amp;gt;&lt;br /&gt;
           &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; elementFormDefault=&amp;quot;qualified&amp;quot; targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;divisionPorCero&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
               &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                           &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                   &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
               &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
           &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;divisionPorCero&amp;quot; element=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;calc:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:part&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot; message=&amp;quot;calc:divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input message=&amp;quot;calc:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output message=&amp;quot;calc:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;calc:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;soap:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:fault name=&amp;quot;divisionPorCero&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:fault name=&amp;quot;divisionPorCero&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:fault&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:input&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:input&amp;gt;&lt;br /&gt;
               &amp;lt;wsdl:output&amp;gt;&lt;br /&gt;
                   &amp;lt;soap:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/wsdl:output&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:operation&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:binding&amp;gt;&lt;br /&gt;
       &amp;lt;wsdl:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
           &amp;lt;wsdl:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;calc:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;soap:address location=&amp;quot;http://localhost:8080/Axis2-15/services/CalculadoraService&amp;quot;/&amp;gt;&lt;br /&gt;
           &amp;lt;/wsdl:port&amp;gt;&lt;br /&gt;
       &amp;lt;/wsdl:service&amp;gt;&lt;br /&gt;
   &amp;lt;/wsdl:definitions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[WSDL de CalculadoraService]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4650</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4650"/>
				<updated>2010-02-16T19:56:53Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
[[WSDL de Servicio Calculadora]]&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                DivisionPorCeroException error = new DivisionPorCeroException();&lt;br /&gt;
                // En caso que no se setee el objeto descripcion, tira un error genérico AxisFault&lt;br /&gt;
                DivisionPorCero div = new DivisionPorCero();&lt;br /&gt;
                // Si no se llenan todos los campos obligatorios, devuelve error 500 de http&lt;br /&gt;
                div.setDivisionPorCero(&amp;quot;Descripcion del error&amp;quot;);&lt;br /&gt;
                error.setFaultMessage(div);&lt;br /&gt;
                throw error;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Se recomienda prestar especial atención al tratamiento de los errores custom.&lt;br /&gt;
Cada error de negocio cuenta con un tipo interno, que contiene la descripción del error. En caso de no llenar dicha descripción, se lanzará un error genérico AxisFault.&lt;br /&gt;
Además hay que tener especial cuidado al llenar dicha descripción. En caso que no se cumpla con el formato, Axis devuelve un error http 500, en vez de un error descriptivo.&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==== Sugerencias para la construcción del WSDL ====&lt;br /&gt;
&lt;br /&gt;
* No utilizar las palabras Error o Exception al final de los tipos o de los mensajes Fault. Estas palabras son utilizadas por el generador de código, por lo que luego el código generado será incorrecto.&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[WSDL de CalculadoraService]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4649</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4649"/>
				<updated>2010-02-16T19:53:11Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Modificaciones respecto el tratamiento de errores&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
[[WSDL de Servicio Calculadora]]&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                DivisionPorCeroException error = new DivisionPorCeroException();&lt;br /&gt;
                // En caso que no se setee el objeto descripcion, tira un error genérico AxisFault&lt;br /&gt;
                DivisionPorCero div = new DivisionPorCero();&lt;br /&gt;
                // Si no se llenan todos los campos obligatorios, devuelve error 500 de http&lt;br /&gt;
                div.setDivisionPorCero(&amp;quot;Descripcion del error&amp;quot;);&lt;br /&gt;
                error.setFaultMessage(div);&lt;br /&gt;
                throw error;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Se recomienda prestar especial atención al tratamiento de los errores custom.&lt;br /&gt;
Cada error de negocio cuenta con un tipo interno, que contiene la descripción del error. En caso de no llenar dicha descripción, se lanzará un error genérico AxisFault.&lt;br /&gt;
Además hay que tener especial cuidado al llenar dicha descripción. En caso que no se cumpla con el formato, Axis devuelve un error http 500, en vez de un error descriptivo.&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==== Sugerencias para la construcción del WSDL ====&lt;br /&gt;
&lt;br /&gt;
* No utilizar las palabras Error o Exception al final de los tipos o de los mensajes Fault. Estas palabras son utilizadas por el generador de código, por lo que luego el código generado será incorrecto.&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[CalculadoraService.wsdl]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Apache_CXF&amp;diff=4628</id>
		<title>Apache CXF</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Apache_CXF&amp;diff=4628"/>
				<updated>2010-02-15T18:04:53Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
=== Construcción de un servicio y su cliente con cxf ===&lt;br /&gt;
La noticia [http://www.dosideas.com/noticias/java/396-servicios-web-con-apache-cxf.html Servicios web con Apache CXF] da una introducción a cxf, explica cómo crear un [[Web Service]] con Apache CXF y también la creación de un cliente que lo consuma.&lt;br /&gt;
&lt;br /&gt;
=== Apache CXF y WebLogic 9.2 ===&lt;br /&gt;
Deployar una aplicación que utiliza Apache CXF en [[WebLogic]] 9.2 provoca un conflicto de versiones de las librerías de jax-ws. Para solucionarlo, el archivo ''weblogic-application.xml'' debe contener lo siguiente:&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;
&amp;lt;weblogic-application xmlns=&amp;quot;http://www.bea.com/ns/weblogic/90&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;!-- Necesario para evitar conflictos de los jar de jax-ws con los que &lt;br /&gt;
   tiene el jar de weblogic --&amp;gt;&lt;br /&gt;
   &amp;lt;prefer-application-packages&amp;gt;&lt;br /&gt;
       &amp;lt;package-name&amp;gt;org.apache.xerces.*&amp;lt;/package-name&amp;gt;&lt;br /&gt;
       &amp;lt;package-name&amp;gt;javax.jws.*&amp;lt;/package-name&amp;gt;&lt;br /&gt;
   &amp;lt;/prefer-application-packages&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;/weblogic-application&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta manera indicamos a weblogic que debe dar prioridad a las clases contenidas en el jar de jax-ws provisto por la aplicación, por sobre la versión de esas mismas clases q están contenidas en el weblogic.jar.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [http://www.dosideas.com/java/396-servicios-web-con-apache-cxf.html Servicios web con Apache CXF]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Axis2ServiceDeployer&amp;diff=4585</id>
		<title>Axis2ServiceDeployer</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Axis2ServiceDeployer&amp;diff=4585"/>
				<updated>2010-02-08T13:15:31Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Axis2ServiceDeployer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;    package com.dosideas.spring;&lt;br /&gt;
    &lt;br /&gt;
    import java.io.ByteArrayOutputStream;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
    import java.io.FileNotFoundException;&lt;br /&gt;
    import java.io.FileOutputStream;&lt;br /&gt;
    import java.io.IOException;&lt;br /&gt;
    import java.io.InputStream;&lt;br /&gt;
    import org.springframework.beans.BeansException;&lt;br /&gt;
    import org.springframework.beans.factory.InitializingBean;&lt;br /&gt;
    import org.springframework.context.ApplicationContext;&lt;br /&gt;
    import org.springframework.context.ApplicationContextAware;&lt;br /&gt;
    import org.springframework.web.context.WebApplicationContext;&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     *&lt;br /&gt;
     * @author ejgarcia&lt;br /&gt;
     */&lt;br /&gt;
    public class Axis2ServiceDeployer implements InitializingBean, ApplicationContextAware {&lt;br /&gt;
        /** Carpeta donde se van a desplegar los servicios. &lt;br /&gt;
         * Debe coincidir la propiedad axis2.repository.path, declarada como&lt;br /&gt;
         * init-param en la definición del AxisServlet en el archivo web.xml&lt;br /&gt;
         */ &lt;br /&gt;
        protected String servicesDeploymentFolder = null;&lt;br /&gt;
        /** Nombre del servicio. El nombre debe coincidir con el wsdl */&lt;br /&gt;
        protected String serviceName = null;&lt;br /&gt;
        private WebApplicationContext ctx;&lt;br /&gt;
        &lt;br /&gt;
        public String getServiceName() {&lt;br /&gt;
            return serviceName;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setServiceName(String serviceName) {&lt;br /&gt;
            this.serviceName = serviceName;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public String getServicesDeploymentFolder() {&lt;br /&gt;
            return servicesDeploymentFolder;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setServicesDeploymentFolder(String servicesDeploymentFolder) {&lt;br /&gt;
            this.servicesDeploymentFolder = servicesDeploymentFolder;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void afterPropertiesSet() {&lt;br /&gt;
            /** creo la estructura de directorios default */&lt;br /&gt;
            File servicesDeploymentFolderFile = new File(servicesDeploymentFolder);&lt;br /&gt;
            servicesDeploymentFolderFile.mkdirs();&lt;br /&gt;
            &lt;br /&gt;
            File serviceFolderFile = &lt;br /&gt;
                new File(servicesDeploymentFolderFile, &amp;quot;services&amp;quot; + &lt;br /&gt;
                    File.separator + serviceName + File.separator + &amp;quot;META-INF&amp;quot;);&lt;br /&gt;
            serviceFolderFile.mkdirs();&lt;br /&gt;
            &lt;br /&gt;
            /** Copio los recursos al directorio */&lt;br /&gt;
            String serviceFileResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/services.xml&amp;quot;;&lt;br /&gt;
            String serviceWsdlResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/&amp;quot; + serviceName + &amp;quot;.wsdl&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            String serviceFileClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceFileResourcePath;&lt;br /&gt;
            String serviceWsdlClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceWsdlResourcePath;&lt;br /&gt;
            //ClassLoader cl = this.getClass().getClassLoader();&lt;br /&gt;
            InputStream serviceIn = ctx.getServletContext().getResourceAsStream(serviceFileClassPath);&lt;br /&gt;
            InputStream wsdlIn = ctx.getServletContext().getResourceAsStream(serviceWsdlClassPath);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceFileClassPath + &amp;quot; : &amp;quot; + serviceIn);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceWsdlClassPath + &amp;quot; : &amp;quot; + wsdlIn);&lt;br /&gt;
            copyInputStreamToFile(serviceIn, new File(servicesDeploymentFolderFile, serviceFileResourcePath));&lt;br /&gt;
            copyInputStreamToFile(wsdlIn, new File(servicesDeploymentFolderFile, serviceWsdlResourcePath));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        private void copyInputStreamToFile(InputStream in, File file) {&lt;br /&gt;
            if (in == null){System.err.println(&amp;quot;No se pudo encontrar... &amp;quot;); return;}&lt;br /&gt;
            FileOutputStream outToFile = null;&lt;br /&gt;
            ByteArrayOutputStream out = null;&lt;br /&gt;
            try {&lt;br /&gt;
                byte[] buffer = new byte[10000];&lt;br /&gt;
                out = new ByteArrayOutputStream();&lt;br /&gt;
                outToFile = new FileOutputStream(file);&lt;br /&gt;
                //int counter = 0;&lt;br /&gt;
                int bytesRead = 0;&lt;br /&gt;
                while ((bytesRead = in.read(buffer, 0, buffer.length)) &amp;gt; 0) {&lt;br /&gt;
                    System.err.println(&amp;quot;bytes leidos: &amp;quot; + bytesRead);&lt;br /&gt;
                    out.write(buffer, 0, bytesRead);&lt;br /&gt;
                    //counter += bytesRead;&lt;br /&gt;
                    //if (bytesRead &amp;lt; buffer.length) break;&lt;br /&gt;
                }&lt;br /&gt;
                out.writeTo(outToFile);&lt;br /&gt;
                &lt;br /&gt;
                in.close();&lt;br /&gt;
                out.close();&lt;br /&gt;
                outToFile.close();&lt;br /&gt;
            } catch (FileNotFoundException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } catch (IOException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } finally {&lt;br /&gt;
                try {&lt;br /&gt;
                    if (in != null) in.close();&lt;br /&gt;
                    if (outToFile != null) outToFile.close();&lt;br /&gt;
                    if (out != null) out.close();&lt;br /&gt;
                } catch (IOException ex) {&lt;br /&gt;
                    ex.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setApplicationContext(ApplicationContext arg0) throws BeansException {&lt;br /&gt;
            this.ctx = (WebApplicationContext)arg0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4584</id>
		<title>Web Service con Axis 2 para Weblogic y Websphere</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4584"/>
				<updated>2010-02-08T13:13:22Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Se agrega enlace a la clase&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hacer un webservice con Axis 2 para Weblogic o IBM Websphere, requiere algunos pasos extra. Esto está relacionado con la forma en que se publican los componentes en Weblogic. Este, a diferencia de los demás servidores de aplicaciones, no descomprime el WAR o el EAR durante la publicación. A saber, existen 3 modalidades para publicar componentes en Weblogic. &lt;br /&gt;
&lt;br /&gt;
*Stage: el componente se publica comprimido y el servidor copia el componente a cada nodo de forma automática. &lt;br /&gt;
*Nostage: el componente se publica descomprimido manualmente. Los nodos acceden al mismo filesystem para leer el componente. &lt;br /&gt;
*Nostage-external: Ídem anterior pero con pasos adicionales de validación.&lt;br /&gt;
&lt;br /&gt;
Axis 2 está preparado solamente leer archivos del filesystem, por lo que no puede interpretar referencias a recursos dentro de un paquete. Esta es la razón por la cual si se despliega un EAR o un WAR en modalidad Stage, los Webservices no funcionarán. &lt;br /&gt;
&lt;br /&gt;
Existen 2 soluciones posibles: &lt;br /&gt;
&lt;br /&gt;
1. Descomprimir el paquete (WAR o EAR) y publicarlo con la modalidad NoStage. Ventaja: funciona como en los demás servidores de aplicaciones, sin necesidad de cambios. Desventaja: en el escenario de despliegue en cluster, la caida del filesystem donde está desplegado el componente causa la no disponibilidad en todos los nodos (ya que todos los nodos leen el componente de ese único filesystem). &lt;br /&gt;
&lt;br /&gt;
2. Aprovechar las características de publicación externa de Axis 2 y guardar en una carpeta local del filesystem la configuración de los servicios de Axis 2. Ventaja: permite la publicación en modalidad Stage; tiene alta disponibilidad en cluster. Desventaja: desarrollo más complejo; replicación innecesaria de recursos. &lt;br /&gt;
&lt;br /&gt;
== Publicación Externa  ==&lt;br /&gt;
&lt;br /&gt;
Dado que Axis 2 solo puede tomar archivos del filesystem, como primer paso, antes que se inicialice Axis, vamos a copiar los archivos de configuración a una carpeta creada por nosotros en el filesystem. &lt;br /&gt;
&lt;br /&gt;
Para ello vamos a tener que hacer 3 pasos: 1. Configurar en el archivo web.xml, un parametro de inicio para el AxisServlet, de forma que quede así. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;servlet&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;display-name&amp;amp;gt;Apache-Axis Servlet&amp;amp;lt;/display-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-name&amp;amp;gt;AxisServlet&amp;amp;lt;/servlet-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-class&amp;amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;amp;lt;/servlet-class&amp;amp;gt;&lt;br /&gt;
        '''&amp;amp;lt;init-param&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-name&amp;amp;gt;axis2.repository.path&amp;amp;lt;/param-name&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-value&amp;amp;gt;''directorio a publicar''&amp;amp;lt;/param-value&amp;amp;gt;'''&lt;br /&gt;
      '''&amp;amp;lt;/init-param&amp;amp;gt;'''&lt;br /&gt;
  &amp;amp;lt;/servlet&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Crear una clase que haga la copia de los archivos de configuración de servicio antes que se inicie Axis, aprovechando la incorporación de Spring al proyecto. &lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
     *&lt;br /&gt;
     * @author ejgarcia&lt;br /&gt;
     */&lt;br /&gt;
    public class Axis2ServiceDeployer implements InitializingBean, ApplicationContextAware {&lt;br /&gt;
        /** Carpeta donde se van a desplegar los servicios. &lt;br /&gt;
         * Debe coincidir la propiedad axis2.repository.path, declarada como&lt;br /&gt;
         * init-param en la definición del AxisServlet en el archivo web.xml&lt;br /&gt;
         */ &lt;br /&gt;
        protected String servicesDeploymentFolder = null;&lt;br /&gt;
        /** Nombre del servicio. El nombre debe coincidir con el wsdl */&lt;br /&gt;
        protected String serviceName = null;&lt;br /&gt;
        private WebApplicationContext ctx;&lt;br /&gt;
        &lt;br /&gt;
        public void afterPropertiesSet() {&lt;br /&gt;
            /** creo la estructura de directorios default */&lt;br /&gt;
            File servicesDeploymentFolderFile = new File(servicesDeploymentFolder);&lt;br /&gt;
            servicesDeploymentFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            File serviceFolderFile = &lt;br /&gt;
                new File(servicesDeploymentFolderFile, &amp;quot;services&amp;quot; + &lt;br /&gt;
                    File.separator + serviceName + File.separator + &amp;quot;META-INF&amp;quot;);&lt;br /&gt;
            serviceFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            /** Copio los recursos al directorio */&lt;br /&gt;
            String serviceFileResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/services.xml&amp;quot;;&lt;br /&gt;
            String serviceWsdlResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/&amp;quot; + serviceName + &amp;quot;.wsdl&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
            String serviceFileClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceFileResourcePath;&lt;br /&gt;
            String serviceWsdlClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceWsdlResourcePath;&lt;br /&gt;
            //ClassLoader cl = this.getClass().getClassLoader();&lt;br /&gt;
            InputStream serviceIn = ctx.getServletContext().getResourceAsStream(serviceFileClassPath);&lt;br /&gt;
            InputStream wsdlIn = ctx.getServletContext().getResourceAsStream(serviceWsdlClassPath);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceFileClassPath + &amp;quot; : &amp;quot; + serviceIn);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceWsdlClassPath + &amp;quot; : &amp;quot; + wsdlIn);&lt;br /&gt;
            copyInputStreamToFile(serviceIn, new File(servicesDeploymentFolderFile, serviceFileResourcePath));&lt;br /&gt;
            copyInputStreamToFile(wsdlIn, new File(servicesDeploymentFolderFile, serviceWsdlResourcePath));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        private void copyInputStreamToFile(InputStream in, File file) {&lt;br /&gt;
            if (in == null){System.err.println(&amp;quot;No se pudo encontrar... &amp;quot;); return;}&lt;br /&gt;
            FileOutputStream outToFile = null;&lt;br /&gt;
            ByteArrayOutputStream out = null;&lt;br /&gt;
            try {&lt;br /&gt;
                byte[] buffer = new byte[10000];&lt;br /&gt;
                out = new ByteArrayOutputStream();&lt;br /&gt;
                outToFile = new FileOutputStream(file);&lt;br /&gt;
                //int counter = 0;&lt;br /&gt;
                int bytesRead = 0;&lt;br /&gt;
                while ((bytesRead = in.read(buffer, 0, buffer.length)) &amp;gt; 0) {&lt;br /&gt;
                    System.err.println(&amp;quot;bytes leidos: &amp;quot; + bytesRead);&lt;br /&gt;
                    out.write(buffer, 0, bytesRead);&lt;br /&gt;
                    //counter += bytesRead;&lt;br /&gt;
                    //if (bytesRead &amp;lt; buffer.length) break;&lt;br /&gt;
                }&lt;br /&gt;
                out.writeTo(outToFile);&lt;br /&gt;
                &lt;br /&gt;
                in.close();&lt;br /&gt;
                out.close();&lt;br /&gt;
                outToFile.close();&lt;br /&gt;
            } catch (FileNotFoundException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } catch (IOException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } finally {&lt;br /&gt;
                try {&lt;br /&gt;
                    if (in != null) in.close();&lt;br /&gt;
                    if (outToFile != null) outToFile.close();&lt;br /&gt;
                    if (out != null) out.close();&lt;br /&gt;
                } catch (IOException ex) {&lt;br /&gt;
                    ex.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
La clase Axis2ServiceDeployer implementa 2 intefases: InitializingBean y ApplicationContextAware. Spring, al detectar la interfaz InitializingBean, ejecuta el método afterPropertiesSet luego de la carga de las propiedades. Dado que Spring se inicia antes que Axis, basta con eso para que inicie el proceso. La otra interfaz, ApplicationContextAware, la necesitamos para obtener el contexto del servlet y de ahí poder acceder a la carpeta WEB-INF, dentro de la cual está la configuración de nuestro servicio. La implementación del método es sencilla. Se crean las carpetas en el filesystem local, se obtienen los recursos de dentro del WAR y se copian al filesystem, respetando la misma estructura de archivos, que es la predeterminada para Axis 2, que es: &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/services.xml &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/&amp;amp;lt;nombre servicio&amp;amp;gt;.wsdl &lt;br /&gt;
&lt;br /&gt;
3. Por último se debe configurar en la clase de despliegue en Spring. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;bean id=&amp;quot;axis2Servicedeployer&amp;quot; class=&amp;quot;com.dosideas.spring.Axis2ServiceDeployer&amp;quot;&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;servicesDeploymentFolder&amp;quot; value=&amp;quot;''directorio a publicar''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;serviceName&amp;quot; value=&amp;quot;''Nombre Servicio''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;/bean&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
El directorio a publicar debe coincidir con el declarado en web.xml&lt;br /&gt;
&lt;br /&gt;
Para descargar la clase completa, haga click en el siguiente enlace: [[Axis2ServiceDeployer]].&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Web Service con Axis 2]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
[[Category:Weblogic]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=WSDL_de_Servicio_Calculadora&amp;diff=4583</id>
		<title>WSDL de Servicio Calculadora</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=WSDL_de_Servicio_Calculadora&amp;diff=4583"/>
				<updated>2010-02-08T13:11:04Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: WSDL de ejemplo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;    &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
    &amp;lt;s0:definitions name=&amp;quot;CalculadoraServiceDefinitions&amp;quot; &lt;br /&gt;
        targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; &lt;br /&gt;
        xmlns:s0=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; &lt;br /&gt;
        xmlns:s1=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; &lt;br /&gt;
        xmlns:p=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; &lt;br /&gt;
        xmlns:s3=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;s0:types&amp;gt;&lt;br /&gt;
        &amp;lt;xs:schema attributeFormDefault=&amp;quot;unqualified&amp;quot; &lt;br /&gt;
        elementFormDefault=&amp;quot;qualified&amp;quot; &lt;br /&gt;
        targetNamespace=&amp;quot;http://www.dosideas.com/cursos/calculadora&amp;quot; &lt;br /&gt;
        xmlns:s0=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; &lt;br /&gt;
        xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;dividendo&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;divisor&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;cociente&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;resto&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;divisionPorCeroErrorType&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:element name=&amp;quot;descripcionError&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero1&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero2&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
                &amp;lt;xs:element name=&amp;quot;sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
                        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
                            &amp;lt;xs:element name=&amp;quot;numero&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
                    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
                &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
            &amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:types&amp;gt;&lt;br /&gt;
      &amp;lt;s0:message name=&amp;quot;divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s0:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;s1:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:part&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:message&amp;gt;&lt;br /&gt;
      &amp;lt;s0:message name=&amp;quot;divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s0:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;s1:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:part&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:message&amp;gt;&lt;br /&gt;
      &amp;lt;s0:message name=&amp;quot;DivisionPorCeroError&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s0:part name=&amp;quot;DivisionPorCeroError&amp;quot; element=&amp;quot;s1:divisionPorCeroErrorType&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:part&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:message&amp;gt;&lt;br /&gt;
      &amp;lt;s0:message name=&amp;quot;sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s0:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;s1:sumaRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:part&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:message&amp;gt;&lt;br /&gt;
      &amp;lt;s0:message name=&amp;quot;sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s0:part name=&amp;quot;parameters&amp;quot; element=&amp;quot;s1:sumaSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:part&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:message&amp;gt;&lt;br /&gt;
      &amp;lt;s0:portType name=&amp;quot;Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s0:operation name=&amp;quot;dividir&amp;quot; parameterOrder=&amp;quot;parameters&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;s0:input message=&amp;quot;s1:divisionSolicitud&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:input&amp;gt;&lt;br /&gt;
          &amp;lt;s0:output message=&amp;quot;s1:divisionRespuesta&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:output&amp;gt;&lt;br /&gt;
          &amp;lt;s0:fault name=&amp;quot;DivisionPorCeroError&amp;quot; message=&amp;quot;s1:DivisionPorCeroError&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:fault&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:operation&amp;gt;&lt;br /&gt;
        &amp;lt;s0:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;s0:input message=&amp;quot;s1:sumarRequest&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:input&amp;gt;&lt;br /&gt;
          &amp;lt;s0:output message=&amp;quot;s1:sumarResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:output&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:operation&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:portType&amp;gt;&lt;br /&gt;
      &amp;lt;s0:binding name=&amp;quot;CalculadoraServiceSoapBinding&amp;quot; type=&amp;quot;s1:Calculadora&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s3:binding style=&amp;quot;document&amp;quot; transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;s0:operation name=&amp;quot;dividir&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;s3:operation soapAction=&amp;quot;&amp;quot; style=&amp;quot;document&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;s0:input&amp;gt;&lt;br /&gt;
            &amp;lt;s3:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/s0:input&amp;gt;&lt;br /&gt;
          &amp;lt;s0:output&amp;gt;&lt;br /&gt;
            &amp;lt;s3:body parts=&amp;quot;parameters&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/s0:output&amp;gt;&lt;br /&gt;
          &amp;lt;s0:fault name=&amp;quot;DivisionPorCeroError&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;s3:fault name=&amp;quot;DivisionPorCeroError&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/s0:fault&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:operation&amp;gt;&lt;br /&gt;
        &amp;lt;s0:operation name=&amp;quot;sumar&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;s3:operation soapAction=&amp;quot;http://www.dosideas.com/cursos/calculadora/sumar&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;s0:input&amp;gt;&lt;br /&gt;
            &amp;lt;s3:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/s0:input&amp;gt;&lt;br /&gt;
          &amp;lt;s0:output&amp;gt;&lt;br /&gt;
            &amp;lt;s3:body use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/s0:output&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:operation&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:binding&amp;gt;&lt;br /&gt;
      &amp;lt;s0:service name=&amp;quot;CalculadoraService&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s0:port name=&amp;quot;CalculadoraSoapPort&amp;quot; binding=&amp;quot;s1:CalculadoraServiceSoapBinding&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;s3:address location=&amp;quot;http://localhost:7001/DosIdeas-Axis2/services/CalculadoraService/&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/s0:port&amp;gt;&lt;br /&gt;
      &amp;lt;/s0:service&amp;gt;&lt;br /&gt;
    &amp;lt;/s0:definitions&amp;gt;&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4582</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4582"/>
				<updated>2010-02-08T13:08:08Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Se agrega el link al WSDL de calculadora&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Copiar WSDL de ejemplo al proyecto ====&lt;br /&gt;
Para este proyecto, tenemos un WSDL de un servicio Calculadora, que tiene 2 operaciones:&lt;br /&gt;
* dividir (división entera)&lt;br /&gt;
* sumar&lt;br /&gt;
&lt;br /&gt;
La operación dividir necesita 2 parámetros, dividendo y divisor y devuelve 2 valores, cociente y resto. Además debe devolver un mensaje de error en caso que el divisor sea 0.&lt;br /&gt;
&lt;br /&gt;
[[WSDL de Servicio Calculadora]]&lt;br /&gt;
&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                throw new DivisionPorCeroError();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4561</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4561"/>
				<updated>2010-02-04T20:28:10Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Se agregaron links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                throw new DivisionPorCeroError();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales. Se sugiere leer la siguiente nota: [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4560</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4560"/>
				<updated>2010-02-04T20:27:23Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Se agregaron links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                throw new DivisionPorCeroError();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4559</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4559"/>
				<updated>2010-02-04T20:25:18Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Configurar web.xml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                throw new DivisionPorCeroError();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; &lt;br /&gt;
    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; &lt;br /&gt;
    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee &lt;br /&gt;
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales.&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4558</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4558"/>
				<updated>2010-02-04T20:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Modificar services.xml para que use Spring */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                throw new DivisionPorCeroError();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales.&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4557</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4557"/>
				<updated>2010-02-04T20:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Modificar services.xml para que use Spring */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                throw new DivisionPorCeroError();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt; org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales.&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4556</id>
		<title>Web Service con Axis 2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2&amp;diff=4556"/>
				<updated>2010-02-04T20:23:37Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Como crear Webservice con Axis 2 y spring&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Axis 2 es un framework para el desarrollo y consumo de Webservices en Java, e intenta solucionar algunos temas pendientes de su predecesor Axis 1.&lt;br /&gt;
&lt;br /&gt;
A continuación haremos un proyecto prototipo, partiendo de un WSDL de un servicio sencillo de calculadora.&lt;br /&gt;
&lt;br /&gt;
== Pasos: ==&lt;br /&gt;
&lt;br /&gt;
==== Crear un proyecto Web con Netbeans ====&lt;br /&gt;
Utilizaremos el nombre DosIdeas-Axis2 para el proyecto.&lt;br /&gt;
==== Agregar la librería Axis 2 al proyecto ====&lt;br /&gt;
Como puede ser que no este instalada, deberemos bajarla del sitio Web (http://ws.apache.org/axis2/download/1_4_1/download.cgi). Utilizaremos la versión 1.4.1 que es la última versión compatible con Java 1.4.&lt;br /&gt;
En la versión 1.5 de Axis 2 cambia bastante la forma de construir Web Services, pero no será visto en este tutorial.&lt;br /&gt;
&lt;br /&gt;
El proyecto viene con muchas mas librerías de las que son estrictamente necesarias para el ejemplo. No obstante, para simplificar incorporaremos todas.&lt;br /&gt;
==== Agregar Spring 2.5 o posterior ====&lt;br /&gt;
Si bien no es imprescindible para el funcionamiento, permite una clara separación de la lógica de negocio de la implementación del servicio Web.&lt;br /&gt;
==== Generar código java a partir de un documento WSDL ====&lt;br /&gt;
Axis 2 viene con un generador de código que ahorra al usuario la construcción de todas clases necesarias para la implementación de WebServices.&lt;br /&gt;
En este caso utilizaremos una tarea Ant para construir dichas clases. En caso de trabajar con Eclipse, también tendremos la posibilidad de utilizar el plugin de Web Services, que viene con la distribución JEE del IDE.&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;D:/development/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src/java&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/CalculadoraService.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;services.folder&amp;quot; value=&amp;quot;web/WEB-INF/services&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.name&amp;quot; value=&amp;quot;CalculadoraService&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- No resuelve bien el path local la tarea Ant --&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/${service.name}.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;service.folder&amp;quot; value=&amp;quot;${services.folder}/${service.name}/META-INF&amp;quot; /&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt; &lt;br /&gt;
            &amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;target name=&amp;quot;run-wsdl2java-server&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;amp;lt;java classname=&amp;quot;org.apache.axis2.wsdl.WSDL2Java&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;classpath refid=&amp;quot;axis2.classpath&amp;quot;/&amp;gt; &lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-uri&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${wsdl.uri}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-ss&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-g&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-sd&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;arg value=&amp;quot;-o&amp;quot;/&amp;gt;&amp;lt;arg file=&amp;quot;${output.wsdl2java.dir}&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;amp;lt;/java&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Move the schema folder to classpath--&amp;gt;&lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;${service.folder}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;mkdir dir=&amp;quot;${service.folder}/service&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;copy todir=&amp;quot;${service.folder}/service&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/resources&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;/copy&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta tarea Ant generará todas las clases involucradas en el Web Service y una serie de archivos, incluyendo la clase que contendrá la lógica de negocio, la cual vendrá con implementaciones dummy.&lt;br /&gt;
Luego se copiaran los clases java al directorio de fuentes y por último se copiará el archivo de configuración y el wsdl al directorio de servicio predeterminado de Axis.&lt;br /&gt;
&lt;br /&gt;
==== Implementar lógica de negocio ==== &lt;br /&gt;
De las clases generadas, la única que tendremos que implementar es la que tiene el sufijo Skeleton. En caso que implementaramos la lógica aquí, sería poco reutilizable, por lo que haremos en un paso siguiente una clase con la lógica de negocio y en el Skeleton tan solo invocaremos dicha clase.&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraServiceSkeleton {&lt;br /&gt;
        &lt;br /&gt;
        protected CalculadoraBo calculadoraBo = null;&lt;br /&gt;
        &lt;br /&gt;
        public CalculadoraBo getCalculadoraBo() {&lt;br /&gt;
            return calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void setCalculadoraBo(CalculadoraBo calculadoraBo) {&lt;br /&gt;
            this.calculadoraBo = calculadoraBo;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param divisionSolicitud&lt;br /&gt;
         * @throws DivisionPorCeroError : &lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.DivisionRespuesta dividir(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.DivisionSolicitud divisionSolicitud)&lt;br /&gt;
                throws DivisionPorCeroError {&lt;br /&gt;
            int divisor = divisionSolicitud.getDivisor();&lt;br /&gt;
            int dividendo = divisionSolicitud.getDividendo();&lt;br /&gt;
            try {&lt;br /&gt;
                int cociente = calculadoraBo.divide(dividendo, divisor);&lt;br /&gt;
                int resto = calculadoraBo.modulo(dividendo, divisor);&lt;br /&gt;
                DivisionRespuesta rta = new DivisionRespuesta();&lt;br /&gt;
                rta.setCociente(cociente);&lt;br /&gt;
                rta.setResto(resto);&lt;br /&gt;
                return rta;&lt;br /&gt;
            } catch (ArithmeticException e) {&lt;br /&gt;
                throw new DivisionPorCeroError();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Auto generated method signature&lt;br /&gt;
         * &lt;br /&gt;
         * @param sumaSolicitud&lt;br /&gt;
         */&lt;br /&gt;
        public com.dosideas.www.cursos.calculadora.SumaRespuesta sumar(&lt;br /&gt;
                com.dosideas.www.cursos.calculadora.SumaSolicitud sumaSolicitud) {&lt;br /&gt;
            SumaRespuesta rta = new SumaRespuesta();&lt;br /&gt;
            rta.setNumero(calculadoraBo.sum(sumaSolicitud.getNumero1(), sumaSolicitud.getNumero2()));    &lt;br /&gt;
            return rta;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
Luego se crea la clase con la lógica de negocio, la cual después se inyectará en la clase Skeleton via Spring&lt;br /&gt;
&lt;br /&gt;
    public class CalculadoraBo {&lt;br /&gt;
        public int sum(int n1, int n2) {&lt;br /&gt;
            return n1 + n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int divide(int n1, int n2){&lt;br /&gt;
            return n1 / n2;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public int modulo(int n1, int n2){&lt;br /&gt;
            return n1 % n2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Configurar descriptores de Spring ====&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;applicationContext&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraBo&amp;quot; class=&amp;quot;com.dosideas.business.CalculadoraBo&amp;quot;&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
    &amp;lt;bean id=&amp;quot;calculadoraService&amp;quot; class=&amp;quot;com.dosideas.www.cursos.calculadora.CalculadoraServiceSkeleton&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;calculadoraBo&amp;quot; ref=&amp;quot;calculadoraBo&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configurar web.xml ====&lt;br /&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;
    &amp;lt;web-app version=&amp;quot;2.4&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&amp;quot;&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;/WEB-INF/applicationContext.xml&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;
        &lt;br /&gt;
        &amp;lt;servlet&amp;gt;&lt;br /&gt;
            &amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-class&amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
            &amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
            &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
        &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
            &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
        &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
    &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modificar services.xml para que use Spring ====&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;ServiceObjectSupplier&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier&amp;lt;/parameter&amp;gt;&lt;br /&gt;
        &amp;lt;parameter name=&amp;quot;SpringBeanName&amp;quot; locked=&amp;quot;false&amp;quot;&amp;gt;calculadoraService&amp;lt;/parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La configuración descrita aquí funciona tanto para Tomcat como para Glassfish.&lt;br /&gt;
En caso que se desee hacer un Web Service para Weblogic o para Websphere, son necesarios algunos pasos adicionales.&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4555</id>
		<title>Web Service con Axis 2 para Weblogic y Websphere</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4555"/>
				<updated>2010-02-04T19:09:39Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Agregado de links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hacer un webservice con Axis 2 para Weblogic o IBM Websphere, requiere algunos pasos extra. Esto está relacionado con la forma en que se publican los componentes en Weblogic. Este, a diferencia de los demás servidores de aplicaciones, no descomprime el WAR o el EAR durante la publicación. A saber, existen 3 modalidades para publicar componentes en Weblogic. &lt;br /&gt;
&lt;br /&gt;
*Stage: el componente se publica comprimido y el servidor copia el componente a cada nodo de forma automática. &lt;br /&gt;
*Nostage: el componente se publica descomprimido manualmente. Los nodos acceden al mismo filesystem para leer el componente. &lt;br /&gt;
*Nostage-external: Ídem anterior pero con pasos adicionales de validación.&lt;br /&gt;
&lt;br /&gt;
Axis 2 está preparado solamente leer archivos del filesystem, por lo que no puede interpretar referencias a recursos dentro de un paquete. Esta es la razón por la cual si se despliega un EAR o un WAR en modalidad Stage, los Webservices no funcionarán. &lt;br /&gt;
&lt;br /&gt;
Existen 2 soluciones posibles: &lt;br /&gt;
&lt;br /&gt;
1. Descomprimir el paquete (WAR o EAR) y publicarlo con la modalidad NoStage. Ventaja: funciona como en los demás servidores de aplicaciones, sin necesidad de cambios. Desventaja: en el escenario de despliegue en cluster, la caida del filesystem donde está desplegado el componente causa la no disponibilidad en todos los nodos (ya que todos los nodos leen el componente de ese único filesystem). &lt;br /&gt;
&lt;br /&gt;
2. Aprovechar las características de publicación externa de Axis 2 y guardar en una carpeta local del filesystem la configuración de los servicios de Axis 2. Ventaja: permite la publicación en modalidad Stage; tiene alta disponibilidad en cluster. Desventaja: desarrollo más complejo; replicación innecesaria de recursos. &lt;br /&gt;
&lt;br /&gt;
== Publicación Externa  ==&lt;br /&gt;
&lt;br /&gt;
Dado que Axis 2 solo puede tomar archivos del filesystem, como primer paso, antes que se inicialice Axis, vamos a copiar los archivos de configuración a una carpeta creada por nosotros en el filesystem. &lt;br /&gt;
&lt;br /&gt;
Para ello vamos a tener que hacer 3 pasos: 1. Configurar en el archivo web.xml, un parametro de inicio para el AxisServlet, de forma que quede así. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;servlet&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;display-name&amp;amp;gt;Apache-Axis Servlet&amp;amp;lt;/display-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-name&amp;amp;gt;AxisServlet&amp;amp;lt;/servlet-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-class&amp;amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;amp;lt;/servlet-class&amp;amp;gt;&lt;br /&gt;
        '''&amp;amp;lt;init-param&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-name&amp;amp;gt;axis2.repository.path&amp;amp;lt;/param-name&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-value&amp;amp;gt;''directorio a publicar''&amp;amp;lt;/param-value&amp;amp;gt;'''&lt;br /&gt;
      '''&amp;amp;lt;/init-param&amp;amp;gt;'''&lt;br /&gt;
  &amp;amp;lt;/servlet&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Crear una clase que haga la copia de los archivos de configuración de servicio antes que se inicie Axis, aprovechando la incorporación de Spring al proyecto. &lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
     *&lt;br /&gt;
     * @author ejgarcia&lt;br /&gt;
     */&lt;br /&gt;
    public class Axis2ServiceDeployer implements InitializingBean, ApplicationContextAware {&lt;br /&gt;
        /** Carpeta donde se van a desplegar los servicios. &lt;br /&gt;
         * Debe coincidir la propiedad axis2.repository.path, declarada como&lt;br /&gt;
         * init-param en la definición del AxisServlet en el archivo web.xml&lt;br /&gt;
         */ &lt;br /&gt;
        protected String servicesDeploymentFolder = null;&lt;br /&gt;
        /** Nombre del servicio. El nombre debe coincidir con el wsdl */&lt;br /&gt;
        protected String serviceName = null;&lt;br /&gt;
        private WebApplicationContext ctx;&lt;br /&gt;
        &lt;br /&gt;
        public void afterPropertiesSet() {&lt;br /&gt;
            /** creo la estructura de directorios default */&lt;br /&gt;
            File servicesDeploymentFolderFile = new File(servicesDeploymentFolder);&lt;br /&gt;
            servicesDeploymentFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            File serviceFolderFile = &lt;br /&gt;
                new File(servicesDeploymentFolderFile, &amp;quot;services&amp;quot; + &lt;br /&gt;
                    File.separator + serviceName + File.separator + &amp;quot;META-INF&amp;quot;);&lt;br /&gt;
            serviceFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            /** Copio los recursos al directorio */&lt;br /&gt;
            String serviceFileResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/services.xml&amp;quot;;&lt;br /&gt;
            String serviceWsdlResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/&amp;quot; + serviceName + &amp;quot;.wsdl&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
            String serviceFileClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceFileResourcePath;&lt;br /&gt;
            String serviceWsdlClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceWsdlResourcePath;&lt;br /&gt;
            //ClassLoader cl = this.getClass().getClassLoader();&lt;br /&gt;
            InputStream serviceIn = ctx.getServletContext().getResourceAsStream(serviceFileClassPath);&lt;br /&gt;
            InputStream wsdlIn = ctx.getServletContext().getResourceAsStream(serviceWsdlClassPath);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceFileClassPath + &amp;quot; : &amp;quot; + serviceIn);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceWsdlClassPath + &amp;quot; : &amp;quot; + wsdlIn);&lt;br /&gt;
            copyInputStreamToFile(serviceIn, new File(servicesDeploymentFolderFile, serviceFileResourcePath));&lt;br /&gt;
            copyInputStreamToFile(wsdlIn, new File(servicesDeploymentFolderFile, serviceWsdlResourcePath));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        private void copyInputStreamToFile(InputStream in, File file) {&lt;br /&gt;
            if (in == null){System.err.println(&amp;quot;No se pudo encontrar... &amp;quot;); return;}&lt;br /&gt;
            FileOutputStream outToFile = null;&lt;br /&gt;
            ByteArrayOutputStream out = null;&lt;br /&gt;
            try {&lt;br /&gt;
                byte[] buffer = new byte[10000];&lt;br /&gt;
                out = new ByteArrayOutputStream();&lt;br /&gt;
                outToFile = new FileOutputStream(file);&lt;br /&gt;
                //int counter = 0;&lt;br /&gt;
                int bytesRead = 0;&lt;br /&gt;
                while ((bytesRead = in.read(buffer, 0, buffer.length)) &amp;gt; 0) {&lt;br /&gt;
                    System.err.println(&amp;quot;bytes leidos: &amp;quot; + bytesRead);&lt;br /&gt;
                    out.write(buffer, 0, bytesRead);&lt;br /&gt;
                    //counter += bytesRead;&lt;br /&gt;
                    //if (bytesRead &amp;lt; buffer.length) break;&lt;br /&gt;
                }&lt;br /&gt;
                out.writeTo(outToFile);&lt;br /&gt;
                &lt;br /&gt;
                in.close();&lt;br /&gt;
                out.close();&lt;br /&gt;
                outToFile.close();&lt;br /&gt;
            } catch (FileNotFoundException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } catch (IOException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } finally {&lt;br /&gt;
                try {&lt;br /&gt;
                    if (in != null) in.close();&lt;br /&gt;
                    if (outToFile != null) outToFile.close();&lt;br /&gt;
                    if (out != null) out.close();&lt;br /&gt;
                } catch (IOException ex) {&lt;br /&gt;
                    ex.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
La clase Axis2ServiceDeployer implementa 2 intefases: InitializingBean y ApplicationContextAware. Spring, al detectar la interfaz InitializingBean, ejecuta el método afterPropertiesSet luego de la carga de las propiedades. Dado que Spring se inicia antes que Axis, basta con eso para que inicie el proceso. La otra interfaz, ApplicationContextAware, la necesitamos para obtener el contexto del servlet y de ahí poder acceder a la carpeta WEB-INF, dentro de la cual está la configuración de nuestro servicio. La implementación del método es sencilla. Se crean las carpetas en el filesystem local, se obtienen los recursos de dentro del WAR y se copian al filesystem, respetando la misma estructura de archivos, que es la predeterminada para Axis 2, que es: &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/services.xml &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/&amp;amp;lt;nombre servicio&amp;amp;gt;.wsdl &lt;br /&gt;
&lt;br /&gt;
3. Por último se debe configurar en la clase de despliegue en Spring. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;bean id=&amp;quot;axis2Servicedeployer&amp;quot; class=&amp;quot;com.dosideas.spring.Axis2ServiceDeployer&amp;quot;&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;servicesDeploymentFolder&amp;quot; value=&amp;quot;''directorio a publicar''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;serviceName&amp;quot; value=&amp;quot;''Nombre Servicio''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;/bean&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
El directorio a publicar debe coincidir con el declarado en web.xml&lt;br /&gt;
&lt;br /&gt;
Para descargar la clase completa, haga click aquí.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Web Service con Axis 2]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
[[Category:Weblogic]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4554</id>
		<title>Cliente Web Service con Ant y Axis2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4554"/>
				<updated>2010-02-04T19:08:36Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crear un cliente Web Service con Axis2 es relativamente sencillo. Crear un cliente Web Service con Ant solo hay que saber algo de Ant, una herramienta indispensable ahora o en un futuro.&lt;br /&gt;
&lt;br /&gt;
El proceso consiste en ejecutar la herramienta WSDL2Java de Axis2 sobre un fichero WSDL para generar el código Java del Stub y las clases OXM (mapeador objeto-XML) de los mensajes del servicio web para posteriormente copiar el código generado al proyecto. Y todo con un simple script de Ant.&lt;br /&gt;
&lt;br /&gt;
==Requisitos==&lt;br /&gt;
Será necesario tener instalado Axis2, basta con bajarse la versión Standard y descomprimirla, y Ant.&lt;br /&gt;
&lt;br /&gt;
==Definición de propiedades==&lt;br /&gt;
El script usará las siguientes propiedades:&lt;br /&gt;
&lt;br /&gt;
* axis2.home: directorio donde está instalado Axis2.&lt;br /&gt;
* output.wsdl2java.dir: directorio donde el wsdl2java generará el código.&lt;br /&gt;
* src.dir: directorio dentro del proyecto donde se copiará el código generado.&lt;br /&gt;
* wsdl.uri: ruta hasta el fichero wsdl.&lt;br /&gt;
* stub.package.name: nombre del paquete para la clase Stub.&lt;br /&gt;
* xsd.namespacetopackages: equivalencia entre los namespaces de los schemas xsd que definen los mensajes y los correspondientes paquetes donde generar las clases OXM.&lt;br /&gt;
* synconly: booleano para indicar si queremos generar un Stub sólo para peticiones síncronas y no asíncronas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las propiedades pueden definirse en el propio script o externalizarse a un fichero de propiedades (todas menos src.dir). Un ejemplo de lo primero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;/deps/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/myWsdl.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;stub.package.name&amp;quot; value=&amp;quot;ws.client&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;xsd.namespacetopackages&amp;quot; value=&amp;quot;http://myService/xsd=ws.client.xsd&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;synconly&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Definición del task wsdl2java==&lt;br /&gt;
El task wsdl2java no es un task incluido en la distribución de Ant, por tanto hay que importar su definición. Para ello hay que cargar en el classpath los jars de Axis2 y luego hacer la definición.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;taskdef name=&amp;quot;wsdl2java&amp;quot; classname=&amp;quot;org.apache.axis2.tool.ant.AntCodegenTask&amp;quot;&lt;br /&gt;
classpathref=&amp;quot;axis2.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar WSDL2Java ==&lt;br /&gt;
&lt;br /&gt;
Finalmente llega el momento de definir el target que ejecutará el wsdl2java. Antes preparará el directorio de salida y después copiará el código generado al proyecto. Aquí está: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;run-wsdl2java-client&amp;quot;&lt;br /&gt;
description=&amp;quot;Genera un cliente webservice apartir de un wsdl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wsdl2java&lt;br /&gt;
output=&amp;quot;${output.wsdl2java.dir}&amp;quot;&lt;br /&gt;
wsdlfilename=&amp;quot;${wsdl.uri}&amp;quot;&lt;br /&gt;
synconly=&amp;quot;${synconly}&amp;quot;&lt;br /&gt;
unpackClasses=&amp;quot;true&amp;quot;&lt;br /&gt;
serverSide=&amp;quot;false&amp;quot;&lt;br /&gt;
databindingName=&amp;quot;adb&amp;quot;&lt;br /&gt;
packageName=&amp;quot;${stub.package.name}&amp;quot;&lt;br /&gt;
testcase=&amp;quot;true&amp;quot;&lt;br /&gt;
namespacetopackages=&amp;quot;${xsd.namespacetopackages}&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El parámetro unpackClasses=&amp;quot;true&amp;quot; indica que las clases OXM deben generarse como clases independientes y no como clases internas de la clase Stub. El parámetro serverSide=&amp;quot;true&amp;quot; indica que queremos generar un cliente webservice. El parámetro databindingName=&amp;quot;adb&amp;quot; indica el motor databinding XML a usar para generar las clases OXM. En este caso es ADB (Axis DataBinding). No está parametrizado, este script sólo funciona con ADB. &lt;br /&gt;
&lt;br /&gt;
Se le puede indicar también que genere una clase de test de JUnit para probar el cliente web service con el parámetro testcase=&amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si se usa XMLBeans se genera además código Java para todos los tipos de datos XSD y unos ficheros binarios usados por las clases OXM. Cada cosa va en un directorio diferente y todos deben incluise en el classpath del proyecto. Lo ideal es compilar tanto las clases OXM como las clases de tipos XSD y crear un jar con los fuentes, los class y estos ficheros binarios para añadirlo al directorio lib del proyecto. &lt;br /&gt;
&lt;br /&gt;
Ha sido fácil y rápido, ¿no? Ya sólo queda probarlo. En el directorio samples del Axis2 encontrareis varios ficheros wsdl para probar.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Web Service con Axis 2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4553</id>
		<title>Cliente Web Service con Ant y Axis2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4553"/>
				<updated>2010-02-04T19:06:10Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
Crear un cliente Web Service con Axis2 es relativamente sencillo. Crear un cliente Web Service con Ant solo hay que saber algo de Ant, una herramienta indispensable ahora o en un futuro.&lt;br /&gt;
&lt;br /&gt;
El proceso consiste en ejecutar la herramienta WSDL2Java de Axis2 sobre un fichero WSDL para generar el código Java del Stub y las clases OXM (mapeador objeto-XML) de los mensajes del servicio web para posteriormente copiar el código generado al proyecto. Y todo con un simple script de Ant.&lt;br /&gt;
&lt;br /&gt;
==Requisitos==&lt;br /&gt;
Será necesario tener instalado Axis2, basta con bajarse la versión Standard y descomprimirla, y Ant.&lt;br /&gt;
&lt;br /&gt;
==Definición de propiedades==&lt;br /&gt;
El script usará las siguientes propiedades:&lt;br /&gt;
&lt;br /&gt;
* axis2.home: directorio donde está instalado Axis2.&lt;br /&gt;
* output.wsdl2java.dir: directorio donde el wsdl2java generará el código.&lt;br /&gt;
* src.dir: directorio dentro del proyecto donde se copiará el código generado.&lt;br /&gt;
* wsdl.uri: ruta hasta el fichero wsdl.&lt;br /&gt;
* stub.package.name: nombre del paquete para la clase Stub.&lt;br /&gt;
* xsd.namespacetopackages: equivalencia entre los namespaces de los schemas xsd que definen los mensajes y los correspondientes paquetes donde generar las clases OXM.&lt;br /&gt;
* synconly: booleano para indicar si queremos generar un Stub sólo para peticiones síncronas y no asíncronas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las propiedades pueden definirse en el propio script o externalizarse a un fichero de propiedades (todas menos src.dir). Un ejemplo de lo primero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;/deps/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/myWsdl.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;stub.package.name&amp;quot; value=&amp;quot;ws.client&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;xsd.namespacetopackages&amp;quot; value=&amp;quot;http://myService/xsd=ws.client.xsd&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;synconly&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Definición del task wsdl2java==&lt;br /&gt;
El task wsdl2java no es un task incluido en la distribución de Ant, por tanto hay que importar su definición. Para ello hay que cargar en el classpath los jars de Axis2 y luego hacer la definición.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;taskdef name=&amp;quot;wsdl2java&amp;quot; classname=&amp;quot;org.apache.axis2.tool.ant.AntCodegenTask&amp;quot;&lt;br /&gt;
classpathref=&amp;quot;axis2.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar WSDL2Java ==&lt;br /&gt;
&lt;br /&gt;
Finalmente llega el momento de definir el target que ejecutará el wsdl2java. Antes preparará el directorio de salida y después copiará el código generado al proyecto. Aquí está: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;run-wsdl2java-client&amp;quot;&lt;br /&gt;
description=&amp;quot;Genera un cliente webservice apartir de un wsdl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wsdl2java&lt;br /&gt;
output=&amp;quot;${output.wsdl2java.dir}&amp;quot;&lt;br /&gt;
wsdlfilename=&amp;quot;${wsdl.uri}&amp;quot;&lt;br /&gt;
synconly=&amp;quot;${synconly}&amp;quot;&lt;br /&gt;
unpackClasses=&amp;quot;true&amp;quot;&lt;br /&gt;
serverSide=&amp;quot;false&amp;quot;&lt;br /&gt;
databindingName=&amp;quot;adb&amp;quot;&lt;br /&gt;
packageName=&amp;quot;${stub.package.name}&amp;quot;&lt;br /&gt;
testcase=&amp;quot;true&amp;quot;&lt;br /&gt;
namespacetopackages=&amp;quot;${xsd.namespacetopackages}&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El parámetro unpackClasses=&amp;quot;true&amp;quot; indica que las clases OXM deben generarse como clases independientes y no como clases internas de la clase Stub. El parámetro serverSide=&amp;quot;true&amp;quot; indica que queremos generar un cliente webservice. El parámetro databindingName=&amp;quot;adb&amp;quot; indica el motor databinding XML a usar para generar las clases OXM. En este caso es ADB (Axis DataBinding). No está parametrizado, este script sólo funciona con ADB. &lt;br /&gt;
&lt;br /&gt;
Se le puede indicar también que genere una clase de test de JUnit para probar el cliente web service con el parámetro testcase=&amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si se usa XMLBeans se genera además código Java para todos los tipos de datos XSD y unos ficheros binarios usados por las clases OXM. Cada cosa va en un directorio diferente y todos deben incluise en el classpath del proyecto. Lo ideal es compilar tanto las clases OXM como las clases de tipos XSD y crear un jar con los fuentes, los class y estos ficheros binarios para añadirlo al directorio lib del proyecto. &lt;br /&gt;
&lt;br /&gt;
Ha sido fácil y rápido, ¿no? Ya sólo queda probarlo. En el directorio samples del Axis2 encontrareis varios ficheros wsdl para probar.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Web Service con Axis 2]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4552</id>
		<title>Web Service con Axis 2 para Weblogic y Websphere</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4552"/>
				<updated>2010-02-04T18:55:30Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hacer un webservice con Axis 2 para Weblogic o IBM Websphere, requiere algunos pasos extra. Esto está relacionado con la forma en que se publican los componentes en Weblogic. Este, a diferencia de los demás servidores de aplicaciones, no descomprime el WAR o el EAR durante la publicación. A saber, existen 3 modalidades para publicar componentes en Weblogic. &lt;br /&gt;
&lt;br /&gt;
*Stage: el componente se publica comprimido y el servidor copia el componente a cada nodo de forma automática. &lt;br /&gt;
*Nostage: el componente se publica descomprimido manualmente. Los nodos acceden al mismo filesystem para leer el componente. &lt;br /&gt;
*Nostage-external: Ídem anterior pero con pasos adicionales de validación.&lt;br /&gt;
&lt;br /&gt;
Axis 2 está preparado solamente leer archivos del filesystem, por lo que no puede interpretar referencias a recursos dentro de un paquete. Esta es la razón por la cual si se despliega un EAR o un WAR en modalidad Stage, los Webservices no funcionarán. &lt;br /&gt;
&lt;br /&gt;
Existen 2 soluciones posibles: &lt;br /&gt;
&lt;br /&gt;
1. Descomprimir el paquete (WAR o EAR) y publicarlo con la modalidad NoStage. Ventaja: funciona como en los demás servidores de aplicaciones, sin necesidad de cambios. Desventaja: en el escenario de despliegue en cluster, la caida del filesystem donde está desplegado el componente causa la no disponibilidad en todos los nodos (ya que todos los nodos leen el componente de ese único filesystem). &lt;br /&gt;
&lt;br /&gt;
2. Aprovechar las características de publicación externa de Axis 2 y guardar en una carpeta local del filesystem la configuración de los servicios de Axis 2. Ventaja: permite la publicación en modalidad Stage; tiene alta disponibilidad en cluster. Desventaja: desarrollo más complejo; replicación innecesaria de recursos. &lt;br /&gt;
&lt;br /&gt;
== Publicación Externa  ==&lt;br /&gt;
&lt;br /&gt;
Dado que Axis 2 solo puede tomar archivos del filesystem, como primer paso, antes que se inicialice Axis, vamos a copiar los archivos de configuración a una carpeta creada por nosotros en el filesystem. &lt;br /&gt;
&lt;br /&gt;
Para ello vamos a tener que hacer 3 pasos: 1. Configurar en el archivo web.xml, un parametro de inicio para el AxisServlet, de forma que quede así. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;servlet&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;display-name&amp;amp;gt;Apache-Axis Servlet&amp;amp;lt;/display-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-name&amp;amp;gt;AxisServlet&amp;amp;lt;/servlet-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-class&amp;amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;amp;lt;/servlet-class&amp;amp;gt;&lt;br /&gt;
        '''&amp;amp;lt;init-param&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-name&amp;amp;gt;axis2.repository.path&amp;amp;lt;/param-name&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-value&amp;amp;gt;''directorio a publicar''&amp;amp;lt;/param-value&amp;amp;gt;'''&lt;br /&gt;
      '''&amp;amp;lt;/init-param&amp;amp;gt;'''&lt;br /&gt;
  &amp;amp;lt;/servlet&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Crear una clase que haga la copia de los archivos de configuración de servicio antes que se inicie Axis, aprovechando la incorporación de Spring al proyecto. &lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
     *&lt;br /&gt;
     * @author ejgarcia&lt;br /&gt;
     */&lt;br /&gt;
    public class Axis2ServiceDeployer implements InitializingBean, ApplicationContextAware {&lt;br /&gt;
        /** Carpeta donde se van a desplegar los servicios. &lt;br /&gt;
         * Debe coincidir la propiedad axis2.repository.path, declarada como&lt;br /&gt;
         * init-param en la definición del AxisServlet en el archivo web.xml&lt;br /&gt;
         */ &lt;br /&gt;
        protected String servicesDeploymentFolder = null;&lt;br /&gt;
        /** Nombre del servicio. El nombre debe coincidir con el wsdl */&lt;br /&gt;
        protected String serviceName = null;&lt;br /&gt;
        private WebApplicationContext ctx;&lt;br /&gt;
        &lt;br /&gt;
        public void afterPropertiesSet() {&lt;br /&gt;
            /** creo la estructura de directorios default */&lt;br /&gt;
            File servicesDeploymentFolderFile = new File(servicesDeploymentFolder);&lt;br /&gt;
            servicesDeploymentFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            File serviceFolderFile = &lt;br /&gt;
                new File(servicesDeploymentFolderFile, &amp;quot;services&amp;quot; + &lt;br /&gt;
                    File.separator + serviceName + File.separator + &amp;quot;META-INF&amp;quot;);&lt;br /&gt;
            serviceFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            /** Copio los recursos al directorio */&lt;br /&gt;
            String serviceFileResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/services.xml&amp;quot;;&lt;br /&gt;
            String serviceWsdlResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/&amp;quot; + serviceName + &amp;quot;.wsdl&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
            String serviceFileClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceFileResourcePath;&lt;br /&gt;
            String serviceWsdlClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceWsdlResourcePath;&lt;br /&gt;
            //ClassLoader cl = this.getClass().getClassLoader();&lt;br /&gt;
            InputStream serviceIn = ctx.getServletContext().getResourceAsStream(serviceFileClassPath);&lt;br /&gt;
            InputStream wsdlIn = ctx.getServletContext().getResourceAsStream(serviceWsdlClassPath);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceFileClassPath + &amp;quot; : &amp;quot; + serviceIn);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceWsdlClassPath + &amp;quot; : &amp;quot; + wsdlIn);&lt;br /&gt;
            copyInputStreamToFile(serviceIn, new File(servicesDeploymentFolderFile, serviceFileResourcePath));&lt;br /&gt;
            copyInputStreamToFile(wsdlIn, new File(servicesDeploymentFolderFile, serviceWsdlResourcePath));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        private void copyInputStreamToFile(InputStream in, File file) {&lt;br /&gt;
            if (in == null){System.err.println(&amp;quot;No se pudo encontrar... &amp;quot;); return;}&lt;br /&gt;
            FileOutputStream outToFile = null;&lt;br /&gt;
            ByteArrayOutputStream out = null;&lt;br /&gt;
            try {&lt;br /&gt;
                byte[] buffer = new byte[10000];&lt;br /&gt;
                out = new ByteArrayOutputStream();&lt;br /&gt;
                outToFile = new FileOutputStream(file);&lt;br /&gt;
                //int counter = 0;&lt;br /&gt;
                int bytesRead = 0;&lt;br /&gt;
                while ((bytesRead = in.read(buffer, 0, buffer.length)) &amp;gt; 0) {&lt;br /&gt;
                    System.err.println(&amp;quot;bytes leidos: &amp;quot; + bytesRead);&lt;br /&gt;
                    out.write(buffer, 0, bytesRead);&lt;br /&gt;
                    //counter += bytesRead;&lt;br /&gt;
                    //if (bytesRead &amp;lt; buffer.length) break;&lt;br /&gt;
                }&lt;br /&gt;
                out.writeTo(outToFile);&lt;br /&gt;
                &lt;br /&gt;
                in.close();&lt;br /&gt;
                out.close();&lt;br /&gt;
                outToFile.close();&lt;br /&gt;
            } catch (FileNotFoundException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } catch (IOException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } finally {&lt;br /&gt;
                try {&lt;br /&gt;
                    if (in != null) in.close();&lt;br /&gt;
                    if (outToFile != null) outToFile.close();&lt;br /&gt;
                    if (out != null) out.close();&lt;br /&gt;
                } catch (IOException ex) {&lt;br /&gt;
                    ex.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
La clase Axis2ServiceDeployer implementa 2 intefases: InitializingBean y ApplicationContextAware. Spring, al detectar la interfaz InitializingBean, ejecuta el método afterPropertiesSet luego de la carga de las propiedades. Dado que Spring se inicia antes que Axis, basta con eso para que inicie el proceso. La otra interfaz, ApplicationContextAware, la necesitamos para obtener el contexto del servlet y de ahí poder acceder a la carpeta WEB-INF, dentro de la cual está la configuración de nuestro servicio. La implementación del método es sencilla. Se crean las carpetas en el filesystem local, se obtienen los recursos de dentro del WAR y se copian al filesystem, respetando la misma estructura de archivos, que es la predeterminada para Axis 2, que es: &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/services.xml &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/&amp;amp;lt;nombre servicio&amp;amp;gt;.wsdl &lt;br /&gt;
&lt;br /&gt;
3. Por último se debe configurar en la clase de despliegue en Spring. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;bean id=&amp;quot;axis2Servicedeployer&amp;quot; class=&amp;quot;com.dosideas.spring.Axis2ServiceDeployer&amp;quot;&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;servicesDeploymentFolder&amp;quot; value=&amp;quot;''directorio a publicar''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;serviceName&amp;quot; value=&amp;quot;''Nombre Servicio''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;/bean&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
El directorio a publicar debe coincidir con el declarado en web.xml&lt;br /&gt;
&lt;br /&gt;
Para descargar la clase completa, haga click aquí.&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4551</id>
		<title>Web Service con Axis 2 para Weblogic y Websphere</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service_con_Axis_2_para_Weblogic_y_Websphere&amp;diff=4551"/>
				<updated>2010-02-04T18:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Como publicar un Webservice hecho con Axis 2 en Weblogic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hacer un webservice con Axis 2 para Weblogic o IBM Websphere, requiere algunos pasos extra. Esto está relacionado con la forma en que se publican los componentes en Weblogic. Este, a diferencia de los demás servidores de aplicaciones, no descomprime el WAR o el EAR durante la publicación. A saber, existen 3 modalidades para publicar componentes en Weblogic. &lt;br /&gt;
&lt;br /&gt;
*Stage: el componente se publica comprimido y el servidor copia el componente a cada nodo de forma automática. &lt;br /&gt;
*Nostage: el componente se publica descomprimido manualmente. Los nodos acceden al mismo filesystem para leer el componente. &lt;br /&gt;
*Nostage-external: Ídem anterior pero con pasos adicionales de validación.&lt;br /&gt;
&lt;br /&gt;
Axis 2 está preparado solamente leer archivos del filesystem, por lo que no puede interpretar referencias a recursos dentro de un paquete. Esta es la razón por la cual si se despliega un EAR o un WAR en modalidad Stage, los Webservices no funcionarán. &lt;br /&gt;
&lt;br /&gt;
Existen 2 soluciones posibles: &lt;br /&gt;
&lt;br /&gt;
1. Descomprimir el paquete (WAR o EAR) y publicarlo con la modalidad NoStage. Ventaja: funciona como en los demás servidores de aplicaciones, sin necesidad de cambios. Desventaja: en el escenario de despliegue en cluster, la caida del filesystem donde está desplegado el componente causa la no disponibilidad en todos los nodos (ya que todos los nodos leen el componente de ese único filesystem). &lt;br /&gt;
&lt;br /&gt;
2. Aprovechar las características de publicación externa de Axis 2 y guardar en una carpeta local del filesystem la configuración de los servicios de Axis 2. Ventaja: permite la publicación en modalidad Stage; tiene alta disponibilidad en cluster. Desventaja: desarrollo más complejo; replicación innecesaria de recursos. &lt;br /&gt;
&lt;br /&gt;
== Publicación Externa  ==&lt;br /&gt;
&lt;br /&gt;
Dado que Axis 2 solo puede tomar archivos del filesystem, como primer paso, antes que se inicialice Axis, vamos a copiar los archivos de configuración a una carpeta creada por nosotros en el filesystem. &lt;br /&gt;
&lt;br /&gt;
Para ello vamos a tener que hacer 3 pasos: 1. Configurar en el archivo web.xml, un parametro de inicio para el AxisServlet, de forma que quede así. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;servlet&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;display-name&amp;amp;gt;Apache-Axis Servlet&amp;amp;lt;/display-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-name&amp;amp;gt;AxisServlet&amp;amp;lt;/servlet-name&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;servlet-class&amp;amp;gt;org.apache.axis2.transport.http.AxisServlet&amp;amp;lt;/servlet-class&amp;amp;gt;&lt;br /&gt;
        '''&amp;amp;lt;init-param&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-name&amp;amp;gt;axis2.repository.path&amp;amp;lt;/param-name&amp;amp;gt;'''&lt;br /&gt;
          '''&amp;amp;lt;param-value&amp;amp;gt;''directorio a publicar''&amp;amp;lt;/param-value&amp;amp;gt;'''&lt;br /&gt;
      '''&amp;amp;lt;/init-param&amp;amp;gt;'''&lt;br /&gt;
  &amp;amp;lt;/servlet&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Crear una clase que haga la copia de los archivos de configuración de servicio antes que se inicie Axis, aprovechando la incorporación de Spring al proyecto. &lt;br /&gt;
&lt;br /&gt;
     /**&lt;br /&gt;
     *&lt;br /&gt;
     * @author ejgarcia&lt;br /&gt;
     */&lt;br /&gt;
    public class Axis2ServiceDeployer implements InitializingBean, ApplicationContextAware {&lt;br /&gt;
        /** Carpeta donde se van a desplegar los servicios. &lt;br /&gt;
         * Debe coincidir la propiedad axis2.repository.path, declarada como&lt;br /&gt;
         * init-param en la definición del AxisServlet en el archivo web.xml&lt;br /&gt;
         */ &lt;br /&gt;
        protected String servicesDeploymentFolder = null;&lt;br /&gt;
        /** Nombre del servicio. El nombre debe coincidir con el wsdl */&lt;br /&gt;
        protected String serviceName = null;&lt;br /&gt;
        private WebApplicationContext ctx;&lt;br /&gt;
        &lt;br /&gt;
        public void afterPropertiesSet() {&lt;br /&gt;
            /** creo la estructura de directorios default */&lt;br /&gt;
            File servicesDeploymentFolderFile = new File(servicesDeploymentFolder);&lt;br /&gt;
            servicesDeploymentFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            File serviceFolderFile = &lt;br /&gt;
                new File(servicesDeploymentFolderFile, &amp;quot;services&amp;quot; + &lt;br /&gt;
                    File.separator + serviceName + File.separator + &amp;quot;META-INF&amp;quot;);&lt;br /&gt;
            serviceFolderFile.mkdirs();&lt;br /&gt;
                &lt;br /&gt;
            /** Copio los recursos al directorio */&lt;br /&gt;
            String serviceFileResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/services.xml&amp;quot;;&lt;br /&gt;
            String serviceWsdlResourcePath = &amp;quot;services/&amp;quot; + serviceName + &amp;quot;/META-INF/&amp;quot; + serviceName + &amp;quot;.wsdl&amp;quot;;&lt;br /&gt;
                &lt;br /&gt;
            String serviceFileClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceFileResourcePath;&lt;br /&gt;
            String serviceWsdlClassPath = &amp;quot;/WEB-INF/&amp;quot; + serviceWsdlResourcePath;&lt;br /&gt;
            //ClassLoader cl = this.getClass().getClassLoader();&lt;br /&gt;
            InputStream serviceIn = ctx.getServletContext().getResourceAsStream(serviceFileClassPath);&lt;br /&gt;
            InputStream wsdlIn = ctx.getServletContext().getResourceAsStream(serviceWsdlClassPath);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceFileClassPath + &amp;quot; : &amp;quot; + serviceIn);&lt;br /&gt;
            System.err.println(&amp;quot;Recurso 2: &amp;quot; + serviceWsdlClassPath + &amp;quot; : &amp;quot; + wsdlIn);&lt;br /&gt;
            copyInputStreamToFile(serviceIn, new File(servicesDeploymentFolderFile, serviceFileResourcePath));&lt;br /&gt;
            copyInputStreamToFile(wsdlIn, new File(servicesDeploymentFolderFile, serviceWsdlResourcePath));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        private void copyInputStreamToFile(InputStream in, File file) {&lt;br /&gt;
            if (in == null){System.err.println(&amp;quot;No se pudo encontrar... &amp;quot;); return;}&lt;br /&gt;
            FileOutputStream outToFile = null;&lt;br /&gt;
            ByteArrayOutputStream out = null;&lt;br /&gt;
            try {&lt;br /&gt;
                byte[] buffer = new byte[10000];&lt;br /&gt;
                out = new ByteArrayOutputStream();&lt;br /&gt;
                outToFile = new FileOutputStream(file);&lt;br /&gt;
                //int counter = 0;&lt;br /&gt;
                int bytesRead = 0;&lt;br /&gt;
                while ((bytesRead = in.read(buffer, 0, buffer.length)) &amp;gt; 0) {&lt;br /&gt;
                    System.err.println(&amp;quot;bytes leidos: &amp;quot; + bytesRead);&lt;br /&gt;
                    out.write(buffer, 0, bytesRead);&lt;br /&gt;
                    //counter += bytesRead;&lt;br /&gt;
                    //if (bytesRead &amp;lt; buffer.length) break;&lt;br /&gt;
                }&lt;br /&gt;
                out.writeTo(outToFile);&lt;br /&gt;
                &lt;br /&gt;
                in.close();&lt;br /&gt;
                out.close();&lt;br /&gt;
                outToFile.close();&lt;br /&gt;
            } catch (FileNotFoundException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } catch (IOException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            } finally {&lt;br /&gt;
                try {&lt;br /&gt;
                    if (in != null) in.close();&lt;br /&gt;
                    if (outToFile != null) outToFile.close();&lt;br /&gt;
                    if (out != null) out.close();&lt;br /&gt;
                } catch (IOException ex) {&lt;br /&gt;
                    ex.printStackTrace();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
La clase Axis2ServiceDeployer implementa 2 intefases: InitializingBean y ApplicationContextAware. Spring, al detectar la interfaz InitializingBean, ejecuta el método afterPropertiesSet luego de la carga de las propiedades. Dado que Spring se inicia antes que Axis, basta con eso para que inicie el proceso. La otra interfaz, ApplicationContextAware, la necesitamos para obtener el contexto del servlet y de ahí poder acceder a la carpeta WEB-INF, dentro de la cual está la configuración de nuestro servicio. La implementación del método es sencilla. Se crean las carpetas en el filesystem local, se obtienen los recursos de dentro del WAR y se copian al filesystem, respetando la misma estructura de archivos, que es la predeterminada para Axis 2, que es: &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/services.xml &lt;br /&gt;
&lt;br /&gt;
WEB-INF/services/&amp;amp;lt;nombre servicio&amp;amp;gt;/META-INF/&amp;amp;lt;nombre servicio&amp;amp;gt;.wsdl &lt;br /&gt;
&lt;br /&gt;
3. Por último se debe configurar en la clase de despliegue en Spring. &lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;bean id=&amp;quot;axis2Servicedeployer&amp;quot; class=&amp;quot;com.dosideas.spring.Axis2ServiceDeployer&amp;quot;&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;servicesDeploymentFolder&amp;quot; value=&amp;quot;''Carpeta Física''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;property name=&amp;quot;serviceName&amp;quot; value=&amp;quot;''Nombre Servicio''&amp;quot; /&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;/bean&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para descargar la clase completa, haga click aquí.&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4550</id>
		<title>Cliente Web Service con Ant y Axis2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4550"/>
				<updated>2010-02-04T17:39:55Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
Crear un cliente Web Service con Axis2 es relativamente sencillo. Crear un cliente Web Service con Ant solo hay que saber algo de Ant, una herramienta indispensable ahora o en un futuro.&lt;br /&gt;
&lt;br /&gt;
El proceso consiste en ejecutar la herramienta WSDL2Java de Axis2 sobre un fichero WSDL para generar el código Java del Stub y las clases OXM (mapeador objeto-XML) de los mensajes del servicio web para posteriormente copiar el código generado al proyecto. Y todo con un simple script de Ant.&lt;br /&gt;
&lt;br /&gt;
==Requisitos==&lt;br /&gt;
Será necesario tener instalado Axis2, basta con bajarse la versión Standard y descomprimirla, y Ant.&lt;br /&gt;
&lt;br /&gt;
==Definición de propiedades==&lt;br /&gt;
El script usará las siguientes propiedades:&lt;br /&gt;
&lt;br /&gt;
* axis2.home: directorio donde está instalado Axis2.&lt;br /&gt;
* output.wsdl2java.dir: directorio donde el wsdl2java generará el código.&lt;br /&gt;
* src.dir: directorio dentro del proyecto donde se copiará el código generado.&lt;br /&gt;
* wsdl.uri: ruta hasta el fichero wsdl.&lt;br /&gt;
* stub.package.name: nombre del paquete para la clase Stub.&lt;br /&gt;
* xsd.namespacetopackages: equivalencia entre los namespaces de los schemas xsd que definen los mensajes y los correspondientes paquetes donde generar las clases OXM.&lt;br /&gt;
* synconly: booleano para indicar si queremos generar un Stub sólo para peticiones síncronas y no asíncronas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las propiedades pueden definirse en el propio script o externalizarse a un fichero de propiedades (todas menos src.dir). Un ejemplo de lo primero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;/deps/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/myWsdl.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;stub.package.name&amp;quot; value=&amp;quot;ws.client&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;xsd.namespacetopackages&amp;quot; value=&amp;quot;http://myService/xsd=ws.client.xsd&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;synconly&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Definición del task wsdl2java==&lt;br /&gt;
El task wsdl2java no es un task incluido en la distribución de Ant, por tanto hay que importar su definición. Para ello hay que cargar en el classpath los jars de Axis2 y luego hacer la definición.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;taskdef name=&amp;quot;wsdl2java&amp;quot; classname=&amp;quot;org.apache.axis2.tool.ant.AntCodegenTask&amp;quot;&lt;br /&gt;
classpathref=&amp;quot;axis2.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar WSDL2Java ==&lt;br /&gt;
&lt;br /&gt;
Finalmente llega el momento de definir el target que ejecutará el wsdl2java. Antes preparará el directorio de salida y después copiará el código generado al proyecto. Aquí está: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;run-wsdl2java-client&amp;quot;&lt;br /&gt;
description=&amp;quot;Genera un cliente webservice apartir de un wsdl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wsdl2java&lt;br /&gt;
output=&amp;quot;${output.wsdl2java.dir}&amp;quot;&lt;br /&gt;
wsdlfilename=&amp;quot;${wsdl.uri}&amp;quot;&lt;br /&gt;
synconly=&amp;quot;${synconly}&amp;quot;&lt;br /&gt;
unpackClasses=&amp;quot;true&amp;quot;&lt;br /&gt;
serverSide=&amp;quot;false&amp;quot;&lt;br /&gt;
databindingName=&amp;quot;adb&amp;quot;&lt;br /&gt;
packageName=&amp;quot;${stub.package.name}&amp;quot;&lt;br /&gt;
testcase=&amp;quot;true&amp;quot;&lt;br /&gt;
namespacetopackages=&amp;quot;${xsd.namespacetopackages}&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El parámetro unpackClasses=&amp;quot;true&amp;quot; indica que las clases OXM deben generarse como clases independientes y no como clases internas de la clase Stub. El parámetro serverSide=&amp;quot;true&amp;quot; indica que queremos generar un cliente webservice. El parámetro databindingName=&amp;quot;adb&amp;quot; indica el motor databinding XML a usar para generar las clases OXM. En este caso es ADB (Axis DataBinding). No está parametrizado, este script sólo funciona con ADB. &lt;br /&gt;
&lt;br /&gt;
Se le puede indicar también que genere una clase de test de JUnit para probar el cliente web service con el parámetro testcase=&amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si se usa XMLBeans se genera además código Java para todos los tipos de datos XSD y unos ficheros binarios usados por las clases OXM. Cada cosa va en un directorio diferente y todos deben incluise en el classpath del proyecto. Lo ideal es compilar tanto las clases OXM como las clases de tipos XSD y crear un jar con los fuentes, los class y estos ficheros binarios para añadirlo al directorio lib del proyecto. &lt;br /&gt;
&lt;br /&gt;
Ha sido fácil y rápido, ¿no? Ya sólo queda probarlo. En el directorio samples del Axis2 encontrareis varios ficheros wsdl para probar.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Web Service con Axis 2 para Weblogic y Websphere]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4549</id>
		<title>Cliente Web Service con Ant y Axis2</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Cliente_Web_Service_con_Ant_y_Axis2&amp;diff=4549"/>
				<updated>2010-02-04T17:38:39Z</updated>
		
		<summary type="html">&lt;p&gt;Esteban: Link al nuevo articulo sobre Axis 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
Crear un cliente Web Service con Axis2 es relativamente sencillo. Crear un cliente Web Service con Ant solo hay que saber algo de Ant, una herramienta indispensable ahora o en un futuro.&lt;br /&gt;
&lt;br /&gt;
El proceso consiste en ejecutar la herramienta WSDL2Java de Axis2 sobre un fichero WSDL para generar el código Java del Stub y las clases OXM (mapeador objeto-XML) de los mensajes del servicio web para posteriormente copiar el código generado al proyecto. Y todo con un simple script de Ant.&lt;br /&gt;
&lt;br /&gt;
==Requisitos==&lt;br /&gt;
Será necesario tener instalado Axis2, basta con bajarse la versión Standard y descomprimirla, y Ant.&lt;br /&gt;
&lt;br /&gt;
==Definición de propiedades==&lt;br /&gt;
El script usará las siguientes propiedades:&lt;br /&gt;
&lt;br /&gt;
* axis2.home: directorio donde está instalado Axis2.&lt;br /&gt;
* output.wsdl2java.dir: directorio donde el wsdl2java generará el código.&lt;br /&gt;
* src.dir: directorio dentro del proyecto donde se copiará el código generado.&lt;br /&gt;
* wsdl.uri: ruta hasta el fichero wsdl.&lt;br /&gt;
* stub.package.name: nombre del paquete para la clase Stub.&lt;br /&gt;
* xsd.namespacetopackages: equivalencia entre los namespaces de los schemas xsd que definen los mensajes y los correspondientes paquetes donde generar las clases OXM.&lt;br /&gt;
* synconly: booleano para indicar si queremos generar un Stub sólo para peticiones síncronas y no asíncronas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Las propiedades pueden definirse en el propio script o externalizarse a un fichero de propiedades (todas menos src.dir). Un ejemplo de lo primero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;axis2.home&amp;quot; value=&amp;quot;/deps/axis2-1.4.1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;output.wsdl2java.dir&amp;quot; value=&amp;quot;build/codegen&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;src.dir&amp;quot; value=&amp;quot;src&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;wsdl.uri&amp;quot; value=&amp;quot;resources/wsdl/myWsdl.wsdl&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;stub.package.name&amp;quot; value=&amp;quot;ws.client&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;xsd.namespacetopackages&amp;quot; value=&amp;quot;http://myService/xsd=ws.client.xsd&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;property name=&amp;quot;synconly&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Definición del task wsdl2java==&lt;br /&gt;
El task wsdl2java no es un task incluido en la distribución de Ant, por tanto hay que importar su definición. Para ello hay que cargar en el classpath los jars de Axis2 y luego hacer la definición.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;path id=&amp;quot;axis2.classpath&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${axis2.home}/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;taskdef name=&amp;quot;wsdl2java&amp;quot; classname=&amp;quot;org.apache.axis2.tool.ant.AntCodegenTask&amp;quot;&lt;br /&gt;
classpathref=&amp;quot;axis2.classpath&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar WSDL2Java ==&lt;br /&gt;
&lt;br /&gt;
Finalmente llega el momento de definir el target que ejecutará el wsdl2java. Antes preparará el directorio de salida y después copiará el código generado al proyecto. Aquí está: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;run-wsdl2java-client&amp;quot;&lt;br /&gt;
description=&amp;quot;Genera un cliente webservice apartir de un wsdl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mkdir dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;delete dir=&amp;quot;${output.wsdl2java.dir}&amp;quot; includeemptydirs=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wsdl2java&lt;br /&gt;
output=&amp;quot;${output.wsdl2java.dir}&amp;quot;&lt;br /&gt;
wsdlfilename=&amp;quot;${wsdl.uri}&amp;quot;&lt;br /&gt;
synconly=&amp;quot;${synconly}&amp;quot;&lt;br /&gt;
unpackClasses=&amp;quot;true&amp;quot;&lt;br /&gt;
serverSide=&amp;quot;false&amp;quot;&lt;br /&gt;
databindingName=&amp;quot;adb&amp;quot;&lt;br /&gt;
packageName=&amp;quot;${stub.package.name}&amp;quot;&lt;br /&gt;
testcase=&amp;quot;true&amp;quot;&lt;br /&gt;
namespacetopackages=&amp;quot;${xsd.namespacetopackages}&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${src.dir}&amp;quot; overwrite=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset dir=&amp;quot;${output.wsdl2java.dir}/src&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;include name=&amp;quot;**/*.java&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/fileset&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El parámetro unpackClasses=&amp;quot;true&amp;quot; indica que las clases OXM deben generarse como clases independientes y no como clases internas de la clase Stub. El parámetro serverSide=&amp;quot;true&amp;quot; indica que queremos generar un cliente webservice. El parámetro databindingName=&amp;quot;adb&amp;quot; indica el motor databinding XML a usar para generar las clases OXM. En este caso es ADB (Axis DataBinding). No está parametrizado, este script sólo funciona con ADB. &lt;br /&gt;
&lt;br /&gt;
Se le puede indicar también que genere una clase de test de JUnit para probar el cliente web service con el parámetro testcase=&amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si se usa XMLBeans se genera además código Java para todos los tipos de datos XSD y unos ficheros binarios usados por las clases OXM. Cada cosa va en un directorio diferente y todos deben incluise en el classpath del proyecto. Lo ideal es compilar tanto las clases OXM como las clases de tipos XSD y crear un jar con los fuentes, los class y estos ficheros binarios para añadirlo al directorio lib del proyecto. &lt;br /&gt;
&lt;br /&gt;
Ha sido fácil y rápido, ¿no? Ya sólo queda probarlo. En el directorio samples del Axis2 encontrareis varios ficheros wsdl para probar.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Web Service con Axis 2]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Apache Axis 2]&lt;/div&gt;</summary>
		<author><name>Esteban</name></author>	</entry>

	</feed>