Servicios Web con Java SE 6.0


Servicios Web con JAX-WS sin contenedores Java EE

Compartir

Por Willy Mejía.
Publicado: Octubre 2007
Modificado: Diciembre 2007.

En Java SE 6.0 se incluye JAX-WS (Java API for XML Web Services). El siguiente cuadro muestra las APIs disponibles en Java SE 6.0 y sus paquetes correspondientes.

Paquete API
javax.xml.ws Núcleo del API JAX-WS
javax.xml.soap API para crear y construir mensajes SOAP
javax.jws Metadatos para la construcción de Servicios Web

La justificación para la inclusión de JAX-WS 2.0 como parte de Java SE 6.0 en lugar de en Java EE 5, es que la entrega de Servicios Web con JAX WS 2.0 no requiere de un contenedor de Servlet o EJB. Esto prácticamente vuelve a HTTP un protocolo intrínseco más para el cómputo distribuido en la plataforma Java, además que extiende el alcance de los Servicios Web.

El presente artículo muestra cómo utilizar las clases y herramientas de JAX-WS incluidas en Java SE 6.0 para crear y publicar un sencillo Servicio Web así como su cliente.

Nota: Para una breve introducción a los Servicios Web puede leer: Guía Breve de Servicios Web.

Creando un Servicio Web muy simple

Para ilustrar la creación de Servicio Web con JAX-WS 2.0 emplearemos el clásico ejemplo de Hola Mundo el cual luce así:

Listado de Hello.java

package hello;
import javax.jws.WebService;

@WebService
public class Hello {
    private String message = new String("Hola ");
    public String sayHello(String name) {
    	String msg = message + name + ".";
        System.out.println(msg);
        return msg; 
    } 
}

Nótese que luce como una clase Java normal pero con un par de adiciones: En primer lugar importamos javax.jws.WebService, lo cual es necesario para marcar la clase Hello con la anotación @WebService. Con esto habilitamos la clase para que pueda ser publicada como un Servicio Web, en éste caso con solo una operación, la del método sayHello.

El siguiente paso es generar los artefactos de despliegue para dicha clase, para ello utilizamos la herramienta wsgen, incluida en Java SE 6.0, a la cual le pasamos como argumento la clase hello.Hello compilada:

>javac hello/Hello.java
>wsgen -cp . hello.Hello

Con todo lo anterior ya tenemos un sencillo Servicio Web casi listo para ser desplegado en algún contenedor Java EE, no obstante podemos probarlo sin un contenedor si creamos un Endpoint dentro de una aplicación que actuará como host del servicio web, tal como se ilustra en el siguiente código:

Listado de SimpleHelloWS.java

import javax.xml.ws.Endpoint;
import hello.Hello;

public class SimpleHelloWS {
  public static void main(String[] args) {    	
    String endpointAddress = "http://localhost:8080/hello";
    Endpoint.publish(endpointAddress, new hello.Hello());
    System.out.println("El Servicio Web Hello se esta ejecutando...");     
    System.out.println("WSDL: " + endpointAddress + "?wsdl");
  }
}

Nótese que se trata de una simple aplicación de consola que utiliza el método publish de la clase javax.xml.ws.Endpoint para crear y publicar un Endpoint para una instancia de la clase hello.Hello en la dirección http://localhost:8080/hello. Esto último gracias a que la clase Endpoint utiliza el servidor web “liviano” de Sun que está incluido en Java SE dentro del paquete com.sun.net.httpserver.

Tras compilar y ejecutar la aplicación se mostraran dos líneas indicando que el servicio se está ejecutando y que la ubicación del «contrato del servicio», es decir el documento WSDL del mismo, para cualquier cliente que desee acceder al mismo.

>javac SimpleHelloWS.java
>java SimpleHelloWS
El Servicio Web Hello se esta ejecutando...
WSDL: http://localhost:8080/hello?wsdl

Por lo que ahora sigue crear un cliente que lo consuma.

Creando un Cliente muy simple para un Servicio Web muy simple

Ahora crearemos —en un directorio/proyecto distinto— el cliente para nuestro Servicio Web el cual debe estar publicado y en ejecución.

Pero primero necesitamos generar los artefactos cliente. Para ello utilizaremos la herramienta wsimport incluida en Java SE 6.0, a la cual le pasamos como argumento la ubicación del contrato del servicio, es decir el documento WSDL:

>wsimport http://localhost:8080/hello?wsdl

Esto generará las clases que encapsulan las operaciones para la invocación de los métodos del Servicio Web. En nuestro caso se generarán seis clases dentro del paquete ‘hello’, entre ellas estan las clases hello.HelloService y hello.Hello que utilizaremos directamente en nuestro cliente.

Una vez generados los artefactos cliente solo resta crear el cliente en sí, nuevamente una simple aplicación de consola:

Listado de Client.java

public class Client {    
  public static void main(String[] args) {    	
    String arg = null;
    String result = null;        
    if (args.length > 0) {
      arg = args[0];
    } 
    else {
      arg = "Anonimo";
    }
    try {              
      hello.HelloService service = new hello.HelloService();
      hello.Hello port = service.getHelloPort();
      result = port.sayHello(arg);
    } 
    catch (Exception ex) {
      result = ex.toString();
    }
    finally{
      System.out.println(result);
    }
  }
}

Nótese que para invocar la operación de nuestro Servicio Web primero creamos el localizador del servicio (con HelloService) y mediante éste obtenemos un puerto (de tipo Hello) por medio del cual después invocamos al método sayHello —tras del cual se invoca la operación del Servicio Web el cual a su vez invoca el método de la clase Hello implementada al inicio del artículo…

Solo resta compilar y ejecutar nuestro cliente con algún argumento, su nombre por ejemplo, si no se especifica un argumento la salida será «Hola Anónimo»:

>javac Client.java
>java Client Yo
Hola Yo.

La misma salida se desplegará en la consola del servicio.

Epílogo

Con todo lo que hemos realizado vemos lo fácil que es crear y publicar un Servicio Web así como su cliente con los paquetes y herramientas de JAX-WS incluidos en Java SE 6.0. Y aunque para un despliegue en producción no podremos prescindir de los contenedores Java EE (Tomcat, Glassfish, JBoss etc…) para los fines de desarrollo de prototipos o durante las primeras fases —así como en proyectos escolares— es suficiente con lo incluido en Java SE 6.0.

No obstante todo esto tan sólo fue el inicio, la finalidad fue dar una introducción al desarrollo de Servicios Web utilizando JAX-WS esperando le motive a continuar para después «abordar el Metro». Quedan entonces muchas cosas por tratar, como la automatización de las tareas que realizamos, crear un servicio y cliente a partir de un WSDL, el despliegue en contenedores Java EE, utilizar contratos de datos y JAXB, utilización de JAXP, StAX y SAAJ, interoperabilidad y WS-* con WSIT, etc. Ya ni se diga de explorar otras opciones para el desarrollo de WS en Java como CXF, Axis2, etc…

Espero que sirva de algo y hasta la próxima,
Willy Mejía.

 

Anexo A: Consumiendo el Servicio desde WCF

Para llevarlo a cabo se requiere tener instalado el .NET Framework 3.0 ó bien 3.5 —los cuales a su vez requieren del .NET Framework 2.0— con su correspondiente SDK.

Primero necesitamos generar los artefactos cliente. Para ello utilizaremos la herramienta svcutil (Herramienta de utilidad de metadatos de ServiceModel) incluida en el Windows SDK for .NET Framework 3.x, a la cual le pasamos como argumento la ubicación del documento WSDL:

>svcutil http://localhost:8080/hello?wsdl /out:Hello.cs /config:Client.exe.config /n:http://hello/,hello

Esto generará un archivo con la clases proxy las cuales encapsularán la invocación de las operaciones del Servicios Web. En nuestro caso se generará el archivo Hello.cs (con la clase HelloClient que utilizaremos directamente en la aplicación cliente) así como el archivo de configuración Client.exe.config, que coincide con el nombre del ejecutable de la aplicación cliente.

Una vez generados los artefactos cliente (proxy) solo resta crear la aplicación cliente en sí, nuevamente una simple aplicación de consola:

Listado de Client.cs

using System;

public class Client
{
  static void Main(string[] args)
  {
    string arg = null;
    string result = null;
    if (args.Length > 0) {
      arg = args[0];
    }
    else {
      arg = “Anónimo”;
    }
    try {
      hello.HelloClient service = new hello.HelloClient();
      result = service.sayHello(arg);
    }
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}

Solo resta compilar tanto el proxy como la aplicación cliente:

>csc /t:library Hello.cs

>csc /t:exe Client.cs /r:Hello.dll

Después ejecute la aplicación cliente con algún argumento:

>Client WCF

Hola WCF.

La misma salida se desplegará en la consola del servicio.

 

Anexo B: Consumiendo el Servicio desde PHP5

Para llevarlo a cabo se requiere tener instalado PHP5 con SOAP habilitado.

PHP5 trae consigo algunas funciones SOAP intrísecas, de las cuales utilizaremos SoapClient para consumir nuestro Servicio Web. A ésta función le pasaremos como argumento la ubicación del documento WSDL, no obstante el mismo debe ser local —en teoría podría ser remoto, pero existen algunos problemas…

Primero debemos descargar y guardar una copia del documento WDSL del Servicio Web junto con cualquier otro documento anexo (WSDL o XSD). En nuestro caso el WSDL: http://localhost:8080/hello?wsdl lo guardamos como hello.wsdl, el cual tiene un XSD adjunto que se puede ver en el WSDL como:

<xsd:import namespace="http://hello/" schemaLocation="http://localhost:8080/hello?xsd=1" />

Por lo que guardamos http://localhost:8080/hello?xsd=1 como hello.xsd. Después editamos la misma línea en nuestro WSDL local (hello.wsdl) de modo que refleje la ubicación de nuestro XSD local (hello.xsd):

<xsd:import namespace="http://hello/" schemaLocation="hello.xsd" />

Así mismo si la ubicación del host del servicio radica en localhost, como es nuestro caso, es preferible cambiarla por la dirección IP: 127.0.0.1, de modo que editamos la línea correspondiente en el WSDL para que quede de la siguiente manera:

<soap:address location="http://127.0.0.1:8080/hello" />

Una vez alojados los documentos en el mismo directorio donde estará nuestro script php (client.php) solo queda escribir el mismo:

Listado de client.php

<?php 
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("hello.wsdl");
try {
  $request->arg0 = "PHP5";
  $response = $client->sayHello($request);
  print $response->return . "\n";
} catch (SoapFault $exception) { 
  echo $exception; 
} 
?>

Tome en cuenta que el nombre de los elementos arg0 y return los tomamos de la definición de los tipos utilizados por el servicio, la cual encontramos en hello.xsd.

Solo resta ejecutar el script desde la línea de comandos o con ayuda de algún servidor web previamente configurado:

>php -f "client.php"

>Hola PHP5.

La misma salida se desplegará en la consola del servicio.

35 respuestas a Servicios Web con Java SE 6.0

  1. heeeeeeeeeeey este articulo esta buenisimo !!!

    y Yo buscando hacer cliente con AXIS, XFIRE y otras cosas !!!!

    excelente !!!

  2. W.M.F.D dijo:

    Excelente, muchas gracias

  3. Abel DIaz dijo:

    Alguien sabe que otros frameworks ademas de axis puedo usar para crear clientes de un servicio web con la version 1.4.1 del jdk de java??????

  4. Willy Mejía dijo:

    JWSDP 1.3 o anterior
    http://java.sun.com/webservices/downloads/1.3/index.html

    Puedes también revisar esta lista:
    http://java-source.net/open-source/web-services-tools
    y si encuentras algo nos comentas.

    Saludos.

    P.D.
    No obstante toma en cuenta que las especificaciones e implementaciones han cambiado un tanto a la fecha y entre mas añeja mayores problemas de interoperabilidad tendrás con servicios web actuales. Si ya «de por sí» es un dolor de cabeza, para que buscarle más…

  5. Antonio dijo:

    Muy bueno el artículo, sí señor.

    He estado trasteando con todo esto desde hace algún tiempo, y me queda una duda que no consigo resolver:

    ¿Cómo hago para incluir en mi WSDL un tipo de datos complejo, sin necesidad de declararlo como un Web Service? Es decir, imaginemos que quiero tener un servicio web «calculadora», donde hago una petición de suma(2,2), y quiero que se me devuelva tanto el resultado (un entero) como la operación invocada (un string). ¿Cómo se definiría esto en la estructura del @WebService?

    Muchas gracias por adelantado, y un saludo para todos.

    Antonio.

  6. Willy Mejía dijo:

    Por como lo entiendo, sería cuestión de definir tu tipo «complejo» (un array, una estructura, etc) pudiendo ayudarte incluso con un documento XSD, en cunjunción con el WSDL…

    Asi pues tu problema no es tanto con el «Service Contract» (WSDL) sino en todo caso con el «Data Contract» (XSD), cosa para lo cual se utiliza JAXB, en el caso de JAX-WS; o bien XMLBeans, Castor, etc., en el caso de otras implementaciones como Axis.

    Espero te sirva de algo.

    Saludos.

  7. Esteban Camporas dijo:

    Querido amigo quiero felicitarte por este articulo porque es uno de los mejores que he visto. Gracias por compartir con un par java todo esto. Te felicito

  8. jose dijo:

    esta muy bien el documento y me gustaria saber terminarlo mi problema es cuando quiero compilar el cliente y se comenta hacer un nuevo proyecto me da un mensaje del paquete hello no existe, pero si tengo el directorio hello con las clases despues de wsimport. Se comenta javac Client.java donde debo colocar el java en la estructura de directorios

    perdon por mi falta de conocimientos

  9. jose dijo:

    Estaba probando el ejercicio en windows vista / cambie a xp y no tuve ningun problema la gestion del classpath en vista no se seria el problema

  10. Willy Mejía dijo:

    En teoría no debieras tener ningún problema en Windows Vista* con el classpath o el PATH, aunque en tu caso pareciera que tuvo que ver con éste último…

    Saludos.

    [*] A excepción de los listados en http://java.sun.com/javase/6/webnotes/index.html#windowsvista

  11. Virginia Torres dijo:

    Muchas Gracias por tu Tutorial!
    A mi compañera y a mí nos sirvió muchísimo! ahora sólo nos falta aprender a ocuparlo con ant….
    pero nos sirvio mucho! gracias nuevamente!

  12. Willy Mejía dijo:

    Dado que Java SE sólo incluye las herramientas «ejecutables», sólo podrías automatizar la ejecución de wsgen y wsimport vía «shell» utilizando la tarea ant «Exec».

    La otra opción es utilizar una distribución completa de JAX-WS -o bien un bundle como Metro- que contenga los paquetes con las clases java de las mismas herramientas y tareas ant respectivas. Para llevarlo a cabo evitando el «endorsamiento» de la api te recomiendo descargar la versión más reciente de JAX-WS que ya no lo requiere.

    Auf Wiedersehen.

  13. Pingback: Creando clientes para el Servicio WCF « WillyXoft

  14. Spiker dijo:

    Como todo el mundo ha dicho… el articulo es perfecto. Muy claro y sencillo.
    Lo cierto es que llevo dias dandome tortas intentando hacerlo, y una vez hecho me encuentro esto. (ya podía haber buscado mejor).

    En fin, tengo una pequeña pregunta si se me permite:

    Si despliego el ejemplo en tomcat, todo va bien, pero si lo despliego en WebSphere el client no me compila. ¿sabes por que?

    Un saludo

  15. Willy Mejía dijo:

    El presente artículo aborda JAX-WS de Java SE 6 que es independiente de cualquier contenedor o AS, por lo que en teoría no tendrías que tener ningún problema en uno si no lo tienes en otro…

    Por otro lado el cliente ilustrado es una aplicación de consola que se ejecuta fuera de cualquier conteneder por lo que no entiendo bien eso de que el cliente no te compila en Websphere. Ahora a que si te refieres a que a la hora de compilar la clase cliente el servicio -que es el que estaría desplegado en Websphere- no responde, pues entonces es cosa del AS…

    Intentaré ayudarte en lo que pueda. Dime que versión de Websphere utilizas, que versión de Java tiene por debajo, que mensaje de error te marca el cliente y/o servicio, y cualquier otro dato relevante…

    Saludos.

  16. isaac dijo:

    Hola a todos, navegando por la red en busca de respuesta a web services he encontrado este magnífico tutorial. Mi problema, igual que con otros web services es que cuando ejecuto el cliente.java me aparecen errores:

    Exception in thread «main» java.lang.NoClassDefFoundError: javax/net/ssl/HttpsURLConnection

    com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)
    at $Proxy29.sayHello(Unknown Source)
    at Client.main(Client.java:14)

    justamente en la línea de código:

    result = port.sayHello(arg);

    Seguramente sea un problema con el CLASSPATH pero no encuentro la solución. Alguna idea? Gracias por vuestra ayuda.

  17. Willy Mejía dijo:

    En primer lugar deseo hacer énfasis que el artículo aplica para Java SE ver. 6.0 (Sun).

    En segundo lugar una pregunta: ¿Estás utilizando SSL? Si es el caso prueba con los siguientes paquetes:
    javax.net.ssl
    com.sun.net.ssl
    com.sun.net.ssl.internal.www.protocol.https

    Por último una referencia que talvez ayude:
    Java Networking and Proxies

    Saludos y…
    ¡Feliz Navidad!

  18. isaac dijo:

    En respuesta a mi anterior post, realmente creo que tengo un problema en mi máquina ya que haciendo la llamada al web services con el mismo código compilado en el lado del servidor funicona sin problemas.

    La verdad es para volverse uno loco … gracias a la GRAN información de las excepciones en java.

    El artículo ayuda mucho a comprender el funcionamiento, creación y ejecución de los servicios web.

    Gracias por todo.

  19. efren dijo:

    Tengo un problema amigo al momente de compilar >javac hello/Hello.java me marca el siguiente error javac: file not found: hello/Hello.java
    Ayuda por favor !!!

    • Willy Mejía dijo:

      Asegúrate que el archivo «Hello.java» esté colocado dentro del subdirectorio (paquete) llamado «hello»

      [dir actual]
         |
         hello
              |
              Hello.java

      Saludos.

  20. efren dijo:

    Muchas gracias, ya me paso de ahi pero al ejecutar
    java SimpleHelloWS marca una excepcion
    Exception in thread «main» javax.xml.ws.WebServiceException: Provider com.sun.xml.ws.spi.ProviderImpl not found

    Caused by: java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl

    😦

    • Willy Mejía dijo:

      Pareciera o que no estás utilizando la versión correcta o que tienes un conflicto de paquetes. ¿Estás utilizando Java SE 6.0 (u4 o superior)? ¿…junto con alguna otra API/Stack/biblioteca?

      Dado que Java SE 6.0 incluye JAX-WS no necesitas agregarlo por fuera. Mas si lo haces, procura trabajar con las versiones recientes que no requieren «endorsamiento».

      JDK 6 Update 4 con JAX-WS 2.1

      Saludos.

  21. Saludos. Me gustó mucho tu artículo. Ahora tengo una pregunta. Quise realizar una prueba con un servicio web propio pero en mi caso supongamos que la clase Hello tiene que importar una clase de java (Ej. java.awt.Point) para hacer operaciones con puntos, por ejemplo el metodo getDistancia(Point p1, Point p2). Después que genero todo el proceso quiero utilizar en mi clase Cliente el método getDistancia, se me presenta un problema: Si hago webservices.Point p1 = new webservices.Point(); que es donde se me generó la clase Point, al hacer p1.setLocation(double, double) se me genera un error de compilación, no me deja utilizar su método. Tampoco puedo hacer java.awt.Point p1 y pasarlo al método getDistancia porque no me lo permite. Que puedo hacer?

    • Willy Mejía dijo:

      Antes que todo debes diseñar tu servicio pensando en mensajes mas que en objetos, la POO es buena al interior de los paquetes/sistemas, mas no hacia afuera… Así pues los servicios no guardan estado (salvo que sea en realidad necesario, y en cuyo caso habrá que diseñar un buen mecanismo para ello). Al servicio solo debes invocarle métodos, pero no trabajar con «propiedades» (set/get), cualquier dato que necesite el método debes pasarlo como parte del mensaje, con parámetros… si es un «objeto», debes crearlo del lado cliente y pasarlo al servicio. Saludos.

  22. rolando dijo:

    Muchas gracias por el articulo, digerible y completo.
    tengo una duda, yo estoy manejando Tomcat y necesito publicar un servicio, pero me pider un archivo war para que sea ejecutado el servicio, me podriasa orientar como hacerlo y como colocarlo en el contenedor Tomcat.
    gracias amigo, que bueno que existe gente como tu que comparte el conocimiento

    • Willy Mejía dijo:

      ¿Que war te pide…?
      Toma en cuenta el framework que estas usando, si utilizas el JAX-WS aquí mencionado solo te debería bastar con el más reciende Java SE 6.0, si stas utilizando alguna otra implementación como Metro o Apache CXF u otra, pues tendras que colocar sus respectivos jar, así como de otras dependencias que tengas, en la ubicación adecuada según la versión de Tomcat (lo cual se explica en su respectiva documentación).
      Ni se diga de otras implementaciones no JAX-WS como Axis2 o Spring-WS, por decir algo.

  23. Flaco dijo:

    Hola,

    Buscando por la web servidores web livianos he dado con este post, he visto que lanzas el WS utilizando el servidor web de sun. Mi pregunta es si en este servidor se pueden publicar servicios en https en ved de http, y si es así cómo?

    Muchas gracias!

  24. jehu dijo:

    Hola Willy:

    Estoy trabajando con jdom en un web service con java ee 5, mi problema es el siguiente : javax.xml.ws.WebServiceException: No es posible crear JAXBContext debido a una restricción de seguridad
    Esto me ocurre al querer que el web service regrese un objeto tipo document.

    Me podrias dar tu opinion.

    • Willy Mejia dijo:

      No me suena familiar el error… ¿Que servidor usas? El de Sun, Glassfish,…?

      Pero si es un documento como tal, se me ocurre que podrías enviarlo como adjunto (usando MTOM)…

      Saludos.

  25. Hola Jehu.

    – Con tu permiso Willy.

    Según puedo ver intentas crear un JAXBContext, esto es utilizado para serializar objetos java en un XML flexible (definido por un esquema XML).

    Creo que para dar una explicación deberías dar un poco de código, ya que no se ve claramente para que quieres crear este JAXBContext, y cual es su relación con el Servicio Web de Java 6.

    Mi correo: kelvin2710 AT hotmail.com
    Está a la orden.

  26. Pipo dijo:

    Hola, el tuto esta super bueno, pero me he encontrado con un problemon que no he podido resolver, no se si es que no realmente no se puede hacer, pero necesito la ayuda.
    La cuestion es que estoy haciendo mi primer web service en java, el entorno que utilizo es:

    Netbeans 6.8.

    Glassfish 3.0(viene instalado por defecto en el IDE).

    JRE 1.6.

    Pero se me ha presentado un problemón que no logro resolver, y es el siguiente:

    Creo mi servicio web desde netbeans, luego creo en este un metodo que retorna tipos primitivos por ejemplo un Integer, le doy clic derecho y pruebo el web service y funcion a las mil maravillas.

    Sin embargo genero un metodo que devuelve un listado de personas usando ArrayList o cualquier otro tipo de estructura Vector, List, etc. El caso es que cuando le doy clic derecho—> Test Web service me da el error siguiente:

    Primero muestra un mensaje diciendo: Unable to Open web service tester Page y que verifique que el web service se desplego correctamente, verifico y si esta desplegado sin problemas.

    Luego si intento probarlo nuevamente me muestra este error en el navegador:
    Exceptions details : nulljava.lang.NullPointerException at java.io.File.(File.java:222) at org.glassfish.webservices.monitoring.WebServiceTesterServlet .initializePort(WebServiceTesterServlet.java:505) at org.glassfish.webservices.monitoring.WebServiceTesterServlet .doGet(WebServiceTesterServlet.java:165) at org.glassfish.webservices.monitoring.WebServiceTesterServlet .invoke(WebServiceTesterServlet.java:100) at org.glassfish.webservices.JAXWSServlet.doGet(JAXWSServlet.ja va:193) at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.StandardWrapper.service(StandardWra pper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke(Standar dWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(Standar dContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPip eline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:9 7) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invo ke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHo stValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(Coyote Adapter.java:332) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAd apter.java:233) at com.sun.enterprise.v3.services.impl.ContainerMapper.service( ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTa sk.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.j ava:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.jav a:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultPr otocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(D efaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocol Chain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocol Chain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolC hain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChai nContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyCon textTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(Abstra ctThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractT hreadPool.java:309) at java.lang.Thread.run(Thread.java:619)

    Error que no se que rayo es, solo me dice que hay un puntero NULL, pero les confieso que mi m’etodo lo unico que hace es lo siguiente:

    @WebMethod(operationName = «getUsuario»)
    public Usuario getUsuario(@WebParam(name = «name»)
    String name) {

    Usuario user = new Usuario(«pepe», «perez»);
    return user;
    }

    Mi pregunta es que si se es posible retornar un arreglo de objetos o un objeto creado por mi, a traves de un web service. Aclaro que he buscado en internet muchos ejemplos, donde si los devuelven, pero nadie hace referencia a ese error que me da a mi. Ese error ocurre repito siempre que creo un metodo en el web service que retorna un objeto de una clase creada por mi. No se si es que debo hacer alg mas al desplegar el webservice, pero todos los ejemplos que encuentro he visto que devuelven objetos complejos creados por ellos mismos. Por favor denme una ayudita con este tema.

    Si elmino ese metodo el web service funciona sin problemas.

  27. Pingback: Amador Zamora Núñez » Web Service WCF .NET

Deja un comentario