15 octubre, 2007

Web Services

.
Web Services es una tecnología middleware que permite exponer como servicio la funcionalidad de los componentes de nuestra aplicación de forma tal que dicha funcionalidad pueda ser accedida en forma remota.

Con Web Services podemos brindar acceso a cierta funcionalidad de nuestros sistemas para mejorar el intercambio de información con nuestros clientes y proveedores, y (por otro lado) podemos incrementar la funcionalidad de nuestras aplicaciones mediante el uso de servicios web externos.


Fundamentos de los Web Services

Un web service es un servicio provisto por alguien al cual podemos acceder para utilizarlo. El servicio puede estar implementado con cualquier tecnología por lo tanto (el proveedor del servicio) debe ofrecer un archivo con extensión wsdl en el que describa los detalles del servicio que provee. Esto es: que mensajes se intercambian, que parámetros se deben pasar, que errores puede tirar, etc.

En este capítulo veremos como utilizar Web Services provistos por terceras partes y (luego) como desarrollar y publicar nuestros propios servicios.


Invocar Web Services provistos por Terceros

Para poder invocar y utilizar un web service primero necesitaremos tener acceso a su wsdl. Luego tendremos que utilizar alguna API que nos permita (desde Java) invocarlo e interactuar con el servicio para lograr el intercambio de mensajes. Esta API (así como las herramientas necesarias) nos la proveerá AXIS, un producto open source de Apache.

A continuación veremos paso a paso como instalar AXIS y luego como utilizarlo para poder invocar un servicio provisto por terceras partes.


Instalar AXIS

1 - Descargar AXIS desde esta dirección: http://apache.patan.com.ar/ws/axis/1_4/axis-src-1_4.zip y descomprimirlo en algún directorio.

2 - Descargar los archivos activation.jar y mail.jar y copiarlos en el directorio $AXIS_HOME/lib.


Configurar un Proyecto en Eclipse

3 - Antes de comenzar con nuestro proyecto lo mejor será crear una librería que agrupe todos los jar de AXIS. Para esto vamos al menú Windows -> Preferences y seleccionamos la opción Java -> Build Path -> User Libraries como vemos a continuación.



Presionando el botón New podemos crear una nueva librería. En este caso vamos a llamarla AXIS_1.4.

4 - Presionando el botón Add Jars... (ubicado a la derecha de la ventana) tenemos que agregar todos los jar que se encuentran en el directorio $AXIS_HOME/lib, incluyedo el mail.jar y el activation.jar que descargamos por separado.



5 - Ahora si, creamos un proyecto Java (común) y en las preferencias del proyecto le agregamos la librería AXIS_1.4
que creamos recién. Esto lo hacemos clikeando en el nombre del proyecto con el botón derecho, seleccionamos Properties - > Java Buil Path -> Libraries - > User Libraries -> Next.




Crear un Cliente para un Web Service

Ahora que tenemos creado un proyecto con los jars necesarios para trabajar con AXIS vamos a crear un cliente que nos permita invocar un servicio web.

En esta página tenemos Web Services publicados que podemos utilizar para realizar pruebas: http://xmethods.com/

Comenzaremos por probar un servicio que, dado un código postal de Estados Unidos retorna el nombre de la localidad. Su wsdl es el siguiente:
http://webservices.imacination.com/distance/Distance.jws?wsdl

AXIS proporciona una herramienta que lee el wsdl y genera las clases Java necesarias para establecer la conexión con el servicio e invocarlo de forma simple y transparente. Esta herramienta es una clase llamada WSDL2Java. También está la herramienta inversa: Java2WSDL que permite generar el wsdl para una clase Java que querramos exponer como servicio web.

1 - Tenemos que generar las clases para interactuar con el web service. Para esto abrimos la librería AXIS_1.4 y buscamos la clase WSDL2Java.class dentro del paquete org.apache.axis.wsdl tal como vemos en la imagen.



2 - La clase WSDL2Java recibe como argumento en línea de comandos la dirección del wsdl que debe mapear. Para pasarle este parámetro hacemos "click" con el botón derecho sobre la clase y seleccionamos Run As -> Run -> Arguments y en "Program Arguments" pegamos la dirección del wsdl:
http://webservices.imacination.com/distance/Distance.jws?wsdl

3 - Una vez que ejecutamos la clase, AXIS generará en el directorio del proyecto las clases necesarias para invocar e interactuar con el web service. Las podemos ver si hacemos "Refresh" sobre el proyecto.



4 - Para poder utilizar estas clases tenemos que copiar toda la rama (desde el directorio com) en nuestro directorio de clases. Simplemente lo hacemos copiando [CTRL+C] y pegando [CTRL+V] desde eclipse.

Entre las clases que generó AXIS tenemos Distance.java. Esta es la interface que define todos los servicios expuestos detrás del web service.

Distance.java
   1:
2:package
3:com.imacination.webservices.distance.Distance_jws;
4:
5:import java.rmi.RemoteException;
6:public interface Distance extends java.rmi.Remote
7:{
8: public String getState(String zip)
9: throws RemoteException;
10:
11: public String getLocation(String zip)
12: throws RemoteException;
13:
14: public String getCity(String zip)
15: throws RemoteException;
16:
17: public double getDistance(String from,String to)
18: throws RemoteException;
19:
20: public double getLatitude(String zip)
21: throws RemoteException;
22:
23: public double getLongitude(String zip)
24: throws RemoteException;
25:}
26:

Veamos ahora nuestro cliente que utiliza estas clases para invocar los servicios expuestos detrás del web service:

Test1WS.java
   1:
2:package test;
3:
4:import com.imacination
5: .webservices.distance.Distance_jws.*;
6:
7:public class TestWS1
8:{
9: public static void main(String[] args)
10: throws Exception
11: {
12: DistanceService service =
13: new DistanceServiceLocator();
14:
15: // aqui obtenemos la interface a traves de
16: // la cual podemos invocar los metodos del
17: // web service
18: Distance distance=service.getDistance();
19:
20: // nombre de la localidad zip=90210
21: String loc1=distance.getLocation("90210");
22: System.out.println("90210="+loc1);
23:
24: // nombre de la localidad zip=14280
25: String loc2=distance.getLocation("14280");
26: System.out.println("14280="+loc2);
27:
28: // calculo la distancia entre las dos
29: // localidades
30: double dist=distance.getDistance(
31: "90210","14280");
32: System.out.print("La distancia entre ");
33: System.out.print("["+loc1+"] y ["+loc2+"]");
34: System.out.println(" es: "+dist);
35: }
36:}
37:

Probemos ahora con otro web service, cuyo wdsl está publicado aquí:
http://demo.wsabi.org/axis/services/YahooUserPingService?wsdl

Este servicio permite saber si un usuario de Yahoo está logueado o no.

Debemos volver a correr WSDL2Java pasándole la dirección del wsdl del web service y luego copiar las clases generadas a la carpeta de código fuente del proyecto.

Luego, un cliente que pruebe el servicio puede ser este:

Test2WS.java
   1:
2:package test;
3:
4:import org.wsabi.demo.axis.services.
5: YahooUserPingService.*;
6:
7:public class TestWS2
8:{
9: public static void main(String[] args)
10: throws Exception
11: {
12: YahooUserPingService service;
13: YahooUserPing ping;
14: boolean online;
15:
16: service = new YahooUserPingServiceLocator();
17: ping = service.getYahooUserPingService();
18:
19: onLine = ping.isUserOnLine("pabloszn");
20: System.out.println(onLine);
21: }
22:}
23:


Escribir Nuestros Propios Web Services

La forma más rápida y simple de instalar un web service en AXIS es utilizando la característica provista por AXIS llamada Instant Deployment.

Con Instant Deployment tan solo tenemos que escribir una clase Java con los métodos que queremos exponer y luego copiarla con extensión jws (Java Web Services) al directorio $AXIS_HOME/webapps/axis.

Veamos entonces el código de nuestro HolaMundo web service.

HolaMundoWS.java
   1:
2:public class HolaMundoWS
3:{
4: public String saludo(String nom)
5: {
6: return new String("Hola Mundo, "+nom);
7: }
8:}
9:

El próximo paso será copiar el archivo HolaMundoWS.java (el código fuente) en el directorio $AXIS_HOME/webapps/axis con el nombre HolaMundoWS.jws.

Ahora vamos a codificar un cliente que invoque el servicio.

HolaMundoClienteWS.java
   1:
2:import javax.xml.rpc.ParameterMode;
3:import org.apache.axis.client.Call;
4:import org.apache.axis.client.Service;
5:import org.apache.axis.encoding.XMLType;
6:
7:public class HolaMundoClient
8:{
9: public static void main(String[] args)
10: throws Exception
11: {
12: // url del servicio que vamos a invocar
13: String endpointURL="http://localhost:8080"
14: +"/axis/HolaMundoWS.jws";
15:
16: // creamos una llamada remota
17: Service service = new Service();
18: Call call = (Call) service.createCall();
19:
20: // seteamos el url
21: call.setTargetEndpointAddress(endpointURL);
22:
23: // nombre del metodo a invocar
24: call.setOperationName("saludo");
25:
26: // nombre del parametro, tipo de dato
27: // y si es parametro de IN,OUT o INOUT
28: call.addParameter("nom"
29: , XMLType.XSD_STRING
30: , ParameterMode.IN);
31:
32: // tipo de dato de retorno
33: call.setReturnType(XMLType.XSD_STRING);
34:
35: // argumentos a pasar
36: Object params[]={ "PabloSZ" };
37:
38: // invocamos el metodo remoto
39: String ret = (String) call.invoke(params);
40:
41: // -- :O) --
42: System.out.println(ret);
43: }
44:}
45:

El tema ahora será levantar el servidor AXIS. Tenemos dos opciones:

1 - Levantar el server que trae axis. Para esto tenemos que correrlo en línea de comandos, posicionados en el directorio $AXIS_HOME/webapps y seteando en el CLASSPATH todos los jar que se encuentran en el directorio lib. Podríamos hacer un .bat que haga todo el trabajo por nosotros.

runServer.bat
   1:
2:@echo off
3:
4:rem JH -> JAVA_HOME
5:@SET JH=\java\jdk1.5.0
6:
7:rem AH -> AXIS_HOME
8:@SET AH=\JAVA\axis-1_4
9:
10:rem ACS -> AXIS CLASS SERVER
11:@SET ACS=org.apache.axis.transport.http
12:@SET ACS=%ACS%.SimpleAxisServer
13:
14:rem CP -> CLASSPATH
15:@SET CP=%AH%\lib\activation.jar;
16:@SET CP=%CP%;%AH%\lib\axis.jar;
17:@SET CP=%CP%;%AH%\lib\axis-ant.jar;
18:@SET CP=%CP%;%AH%\lib\commons-discovery-0.2.jar;
19:@SET CP=%CP%;%AH%\lib\commons-logging-1.0.4.jar;
20:@SET CP=%CP%;%AH%\lib\jaxrpc.jar;
21:@SET CP=%CP%;%AH%\lib\log4j-1.2.8.jar;
22:@SET CP=%CP%;%AH%\lib\saaj.jar;
23:@SET CP=%CP%;%AH%\lib\mail.jar;
24:@SET CP=%CP%;%AH%\lib\wsdl4j-1.5.1.jar;
25:
26:%JH%\bin\java -cp %CP% %ACS%
27:

2 - La otro opción es copiar el directorio axis (ubicado en $AXIS_HOME/webapps) al $TOMCAT_HOME/webapps. Es decir: deployar AXIS como una aplicación web en tomcat. Luego (obviamente) correr Tomcat.


Lamentablemente, algo tan simple solo puede servir para muy poco... Con Instant Deployment solo podemos deployar servicios que manejen tipos básicos (no clases nuestras serializables). Tampoco podemos utilizar paquetes, etc.

Para deployar web services un poco más complejos tendremos que deployarlos de otra forma, como veremos a continuación.


Custom Deployment

Para deployar un servicio con custom deployment será necesario escribir un archivo wsdd con código xml que describa el web service.

Vamos a plantear un ejemplo. Se trata de un servicio FacadeWS que tiene dos métodos: login y obtenerUsuarios. El método login recibe usuario y password y retorna un UsuarioDTO si el login fue exitoso o null si no lo fue. El método obtenerUsuarios retorna una Collection de UsuarioDTO con todos los usuarios registrados en el sistema.

1 - Creamos las clases UsuarioDTO.java y FacadeWS.java

UsuarioDTO.java
   1:
2:package test.customdeploy;
3:import java.io.Serializable;
4:
5:public class UsuarioDTO implements Serializable
6:{
7: private String username;
8: private String password;
9: private String email;
10:
11: // constructor nulo
12: public UsuarioDTO(){ }
13:
14: // constructor con los campos
15: public UsuarioDTO(String username
16: ,String password
17: , String email)
18: {
19: this.username = username;
20: this.password = password;
21: this.email = email;
22: }
23:
24: // getters
25: public String getUsername() { return username; }
26: public String getPassword() { return password; }
27: public String getEmail() { return email; }
28:
29: // setters
30:
31: public void setUsername(String username)
32: {
33: this.username = username;
34: }
35:
36: public void setPassword(String password)
37: {
38: this.password = password;
39: }
40:
41: public void setEmail(String email)
42: {
43: this.email = email;
44: }
45:
46: // toString para poder imprimir facilmente un dto
47: public String toString()
48: {
49: return username+", "+password+", "+email;
50: }
51:}
52:

Como vemos, UsuarioDTO simplemente es un bean con atributos, setters y getters, e implementa la interface Serializable ya que debe viajar entre el servidor y el cliente.

Veamos ahora la clase FacadeWS.

FacadeWS.java
   1:
2:package test.customdeploy;
3:import java.util.*;
4:
5:public class FacadeWS
6:{
7: private Hashtable usuarios;
8:
9: public FacadeWS()
10: {
11: // tabla de usuarios
12: usuarios = new Hashtable();
13:
14: // harcodeamos los usuarios
15: usuarios.put("juan"
16: ,new UsuarioDTO("juan"
17: , "juan1"
18: , "juan@pp.com"));
19: usuarios.put("jose"
20: ,new UsuarioDTO("jose"
21: , "jose1"
22: , "jose@toto.net"));
23: usuarios.put("pedro"
24: ,new UsuarioDTO("pedro"
25: , "pedro1"
26: , "pedro@locomia.org"));
27: }
28:
29: // si el login es correcto retorna el UsuarioDTO
30: // si no es correcto retorna null
31: public UsuarioDTO login(String usr, String pwd)
32: {
33: // busco el usr en la tabla
34: UsuarioDTO dto=(UsuarioDTO)usuarios.get(usr);
35:
36: // si existe...
37: if ( dto != null )
38: {
39: // si coincide el password...
40: if ( dto.getPassword().equals(pwd) )
41: {
42: // retorno el dto !
43: return dto;
44: }
45: else
46: {
47: return null;
48: }
49: }
50: return null;
51: }
52:
53: // retorna la coleccion de usuarios
54: public Collection obtenerUsuarios()
55: {
56: Vector ret = new Vector();
57: for( Enumeration e = usuarios.elements()
58: ; e.hasMoreElements(); )
59: {
60: ret.add(e.nextElement());
61: }
62: return ret;
63: }
64:}
65:

2 - Creamos un .jar con el las clases que queremos deployar.

Teniendo definidas todas las clases involucradas (FacadeWS y UsuarioDTO, ambas en el paquete test.customdeploy) podemos crear el jar desde Eclipse "clikeando" con el botón derecho sobre el paquete test.customdeploy, seleccionando Export -> JAR File. o bien desde línea de comandos, parados en la carpeta src (padre de test) con el comando jar:

jar cvf test.jar test

El comando jar está ubicado en $JAVA_HOME/bin por lo tanto tenemos que asegurarnos que el PATH esté seteado correctamente.

3 - Copiamos el jar al directorio axis/WEB-INF/lib para que esté disponible en el CLASSPATH.

4 - Generamos el descriptor wsdd.

Como dijimos, para deployar un servicio con custom deployment será necesario escribir un archivo wsdd. Veamos entonces el descriptor para nuestro FacadeWS.

facadeWS.wsdd
   1:
2:<deployment xmlns="http://xml.apache.org/axis/wsdd/"
3: xmlns:java=
4: "http://xml.apache.org/axis/wsdd/providers/java">
5: <service name="FacadeWS" provider="java:RPC">
6: <parameter name="scope"
7: value="application" />
8: <parameter name="className"
9: value="test.customdeploy.FacadeWS"/>
10: <parameter name="allowedMethods"
11: value="*" />
12: <beanMapping qname="ns:UsuarioDTO"
13: xmlns:ns="http://localhost:8080/WS/FacadeWS"
14: languageSpecificType=
15: "java:test.customdeploy.UsuarioDTO" />
16: </service>
17:</deployment>
18:

En el wsdd estamos definiendo lo siguiente:
  • Nombre y Tipo de Servicio - FacadeWS (RPC)
  • Scope - aplication (que duración tendrá la instancia de FacadeWS). Puede ser request, session o application
  • Métodos Expuestos - En nuestro caso serán todos (por eso el "*")
  • Tipos de Dato Propietarios - UsuarioDTO

5 - Registrar el Servicio

Tenemos que registrar el servicio. Para esto utilizaremos el comando (clase de AXIS) AdminClient. Lo vamos a invocar a través del siguiente batch.

adminClient.bat
   1:
2:@echo off
3:
4:rem JH -> JAVA_HOME
5:@SET JH=\java\jdk1.5.0
6:
7:rem AH -> AXIS_HOME
8:@SET AH=\JAVA\axis-1_4
9:
10:rem AAC -> AXIS ADMIN CLIENT
11:@SET AAC=org.apache.axis.client
12:@SET AAC=%AAC%.AdminClient
13:
14:rem CP -> CLASSPATH
15:@SET CP=%AH%\lib\activation.jar;
16:@SET CP=%CP%;%AH%\lib\axis.jar;
17:@SET CP=%CP%;%AH%\lib\axis-ant.jar;
18:@SET CP=%CP%;%AH%\lib\commons-discovery-0.2.jar;
19:@SET CP=%CP%;%AH%\lib\commons-logging-1.0.4.jar;
20:@SET CP=%CP%;%AH%\lib\jaxrpc.jar;
21:@SET CP=%CP%;%AH%\lib\log4j-1.2.8.jar;
22:@SET CP=%CP%;%AH%\lib\saaj.jar;
23:@SET CP=%CP%;%AH%\lib\mail.jar;
24:@SET CP=%CP%;%AH%\lib\wsdl4j-1.5.1.jar;
25:
26:%JH%\bin\java -cp %CP% %AAC% %1
27:

Antes de ejecutar este comando debemos asegurarnos de que el server de AXIS esté levantado (ya sea detrás de Tomcat o en línea de comandos).

Corremos el comando de la siguiente manera:

adminClient facadeWS.wsdd

Si todo está bien entonces veremos la siguiente salida:

Processing file facadeWS.wsdd
<Admin>Done processing</Admin>

6 - Ahora, accediendo a: http://localhost:8080/axis/services veremos que entre los servicios deployados está nuestro FacadeWS, con sus métodos y con la opción de visualizar su wsdl.

7 - Para crear el cliente podríamos usar el utilitario WSDL2Java como vimos al comienzo de este capítulo pero en este caso lo vamos a crear a mano.

FacadeWSClient.java
   1:
2:package test;
3:
4:import java.util.Collection;
5:import javax.xml.namespace.QName;
6:import javax.xml.rpc.ParameterMode;
7:import org.apache.axis.client.Call;
8:import org.apache.axis.client.Service;
9:import org.apache.axis.encoding.XMLType;
10:import test.customdeploy.UsuarioDTO;
11:
12:public class FacadeWSClient
13:{
14: // direccion del servicio
15: public static String endpoint =
16: "http://localhost:8080/axis/services/FacadeWS";
17:
18: public static void main(String[] args)
19: throws Exception
20: {
21: // harcodeo usuario y password
22: String usr="pedro";
23: String pwd="pedro1";
24:
25: // invoco el login
26: // a traves de un metodo privado
27: UsuarioDTO dto=invocarLogin(usr,pwd);
28: System.out.println(dto);
29:
30: // invoco obtenerUsuarios a traves
31: // de un metodo privado
32: Collection arr=invocarObtenerUsuarios();
33: System.out.println(arr);
34: }
35:
36: private static UsuarioDTO invocarLogin(
37: String usr
38: , String pwd)
39: {
40: try
41: {
42:
43: Service service = new Service();
44: Call call = (Call) service.createCall();
45:
46: // hay que definir un QName por cada tipo
47: // de datos custom que vayamos a utilizar
48: QName qn = new QName(
49: "http://localhost:8080/WS/FacadeWS"
50: ,"UsuarioDTO");
51:
52:
53: // registramos en la llamada remota
54: // el tipo de dato custom
55: call.registerTypeMapping(
56: UsuarioDTO.class
57: ,qn
58: ,new BeanSerializerFactory(
59: UsuarioDTO.class
60: ,qn)
61: ,new BeanDeserializerFactory(
62: UsuarioDTO.class
63: ,qn));
64: call.setTargetEndpointAddress(endpoint);
65: call.setOperationName("login");
66: call.addParameter("usr"
67: ,XMLType.XSD_STRING
68: ,ParameterMode.IN);
69: call.addParameter("pwd"
70: ,XMLType.XSD_STRING
71: ,ParameterMode.IN);
72: call.setReturnType(qn);
73: UsuarioDTO dto=(UsuarioDTO)
74: call.invoke(new Object[]{ usr,pwd });
75: return dto;
76: }
77: catch(Exception ex)
78: {
79: ex.printStackTrace();
80: throw new RuntimeException(ex);
81: }
82: }
83: private static Collection invocarObtenerUsuarios()
84: {
85: try
86: {
87: Service service = new Service();
88: Call call = (Call) service.createCall();
89: QName qn = new QName(
90: "http://localhost:8080/WS/FacadeWS"
91: ,"UsuarioDTO");
92:
93: // registramos en la llamada remota
94: // el tipo de dato custom que recibiremos
95: // dentro de la coleccion
96: call.registerTypeMapping(
97: UsuarioDTO.class
98: ,qn
99: ,new BeanSerializerFactory(
100: UsuarioDTO.class
101: ,qn)
102: ,new BeanDeserializerFactory(
103: UsuarioDTO.class
104: ,qn));
105:
106: // direccion del servicio
107: call.setTargetEndpointAddress(endpoint);
108:
109: // nombre del metodo
110: call.setOperationName("obtenerUsuarios");
111: call.setReturnType(XMLType.XSD_ANYTYPE);
112:
113: // que tipo de clase esperamos
114: call.setReturnClass(Collection.class);
115: Collection coll=(Collection)
116: call.invoke((Object[])null);
117:
118: return coll;
119:
120: }
121: catch(Exception ex)
122: {
123: ex.printStackTrace();
124: throw new RuntimeException(ex);
125: }
126: }
127:}
128:













.


12 comentarios:

Francisco Riveros dijo...

muy bueno gracias me ayudo bastante, eso si todavia tengo problemas al generar un WS...

bueno gracias

Anónimo dijo...

Hola, tengo un problema, en el segundo caso, al publicar el WS me dice que todo está bien, pero luego miro en los servicios publicados y no está, y al intentar acceder a el me dice igualmente que no está publicado.

Anónimo dijo...

Seguramente si la consola del servidor, te dice que no se encuentran las clases
las clases UsusarioDTO y FacadeWS, es porque la ruta del deploy no está en el path, y por lo tanto no puede encontrar las clases
Yo lo agregué así:
@SET CP=%CP%;%AH%\webapps\axis\WEB-INF; en runServer.bat

Anónimo dijo...

Buenísimo Pablo, pude armar mi cliente/servidor

Lo único que tuve que cambiar es la dirección por como estaba publicando mis servicios.

"http://localhost:8080/WebServiceProject/services"

Anónimo dijo...

Hola, muchas Gracias a Pablo por sus publicaciones, me han servido de mucho.

En mi caso aparte de agregar lo que anita dijo, por alguna razón colocar el jar no me funcionó, así que tuve que colocar dentro de WEB-INF una carpeta llamada test, dentro una carpeta llamada customdeploy y dentro los dos .class (FacadeWS.class y UsuarioDTO.class) de esta manera no me daba el error en la consola de que no encontraba las clases.

Gracias!!!

Chape dijo...

su pudieras ayudarme con un error que tengo al tratar de acceder a mi webservice...

Exception in thread "main" AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.net.UnknownHostException: crazygenius
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.net.UnknownHostException: crazygenius
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:153)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:120)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at MANIF.QueryManif_wsdl.QueryManifBindingStub.consultaManif(QueryManifBindingStub.java:212)
at prueba.main(prueba.java:17)

{http://xml.apache.org/axis/}hostname:Martin-ciappe

java.net.UnknownHostException: crazygenius
at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at MANIF.QueryManif_wsdl.QueryManifBindingStub.consultaManif(QueryManifBindingStub.java:212)
at prueba.main(prueba.java:17)
Caused by: java.net.UnknownHostException: crazygenius
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:153)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:120)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
... 11 more
te agradeceria de verdad

saludos

Anónimo dijo...

He hecho los pasos aqui mstrados pero me arroja una serie de mensajes como el que sigue "http://www.w3.org/2001/XMLSchema}schema already exists" y no genera las clases para invocarlo

Unknown dijo...

Ignoro si sigues teniendo activo el blog, pero esta entrada me ayudó bastante.

Muchas gracias,

PabloSZ dijo...

Hola Luiyo, el blog sigue activo. Lo que pasa es que estoy trabajando en la nueva versión y por eso hace tiempo que no posteo nada nuevo.

La nueva versión del blog explica Java desde cero, comparando Java con Pascal y C. En la página principal, donde está la foto de mi pibe anoto el estado de progreso del nuevo blog. Actualmente te diría que está en un 70%.

Saludos y GRACIAS por visitar el blog.

Pablo !

Anónimo dijo...

Buenas Pablo,

He intentado hacer la parte de FacadeWS, lo he hecho todo, pero me saca el siguiente error:

- Unable to deploy typemapping: {http://localhost:8080/axis/FacadeWS}UsuarioDTO
java.lang.ClassNotFoundException: test.customdeploy.UsuarioDTO

No encuentra la clase UsuarioDTO. El jar test.jar lo he puesto en TOMCAT_HOME\webapp\axis\WEB-INF\lib, y estoy lanzando el comando adminClient facadeWS.wsdd desde el mismo directorio ya es allí donde he colocados los ficheros facadeWS.wsdd y adminClient.bat. El tomcat lo arranco con Eclipse con el pluging de Tomcat.

Alguna idea?? Gracias de antemano.

Noé dijo...

Hola, las urls de ejemplos ya no están disponibles. ¿Podrías actualizar el artículo? Mil gracias.

Anónimo dijo...

Muchas gracias, no conocía los ws, iluminaste mi camino!!

Saludos