martes, agosto 20, 2013

Ejemplo Web Service Metro JAX-WS RI 2.2.8

Este es un un ejemplo básico de un Web Service desarollado en Java especificacion JAX-WS, en algun momento lo necesitare recordar por esa razón coloco por si alguna vez mi corta memoria me traiciona, y claro para que alguien mas lo pueda utilizar como base.

Herramientas utilizadas
Java 1.6
Eclipse Version: 3.7.2 Indigo
JAX-WS RI 2.2.8
Soap UI 4.5.2
Tomcat 6



Paso 1:Generar el proyecto desde el menu new project
Damos click en siguiente

 Y click en boton Finish
Se genera el proyecto como se ve a continuación 


Paso2: Agregamos el paquete com.operaciones.basicas y los archivos Respuesta.java y Servidor.java

Aqui el codigo de cada clase

package com.operaciones.basicas;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebService;



@WebService()
public class Servidor {

@WebMethod(operationName="Operaciones")
    public  List Operaciones(int numero1,int numero2){
        List lista=new ArrayList();
        Respuesta r=new Respuesta();
        int suma= numero1+ numero2;
        int resta=numero1-numero2;
        double division= numero1/numero2;
        int multiplicacion=numero1*numero2;
        
        r.setTipo("Respuesta Suma");
        r.setRespuesta(String.valueOf(suma));
        lista.add(r);
        r=new Respuesta();
        r.setTipo("Respuesta resta");
        r.setRespuesta(String.valueOf(resta));
        lista.add(r);
        r=new Respuesta();
        r.setTipo("Respuesta division");
        r.setRespuesta(String.valueOf(division));
        lista.add(r);
        r=new Respuesta();
        r.setTipo("Respuesta multiplicacion");
        r.setRespuesta(String.valueOf(multiplicacion));
        lista.add(r);

        
        return  lista; 
        
    }

}

package com.operaciones.basicas;
public class Respuesta {

    String tipo;
    String respuesta;
    public String getTipo() {
        return tipo;
    }
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }
    public String getRespuesta() {
        return respuesta;
    }
    public void setRespuesta(String respuesta) {
        this.respuesta = respuesta;
    }
}

Paso 3: Agregamos en WebContent el xml sun-jaxws.xml

aqui el contenido

xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
implementation="com.operaciones.basicas.Servidor"
url-pattern="/ServidorPort">




En el web.xml deberemos colocar el listener para que sea llamado al momento desplegar el proyecto
debe quedar maso menos así

  WSOperaciones
 
    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp
 
  
   
    JAX-WS endpoint - ServidorService
    ServidorService
    ServidorService
   
  com.sun.xml.ws.transport.http.servlet.WSServlet
 
    1
 
 
    ServidorService
    /ServidorPort
 
 
    index.jsp
 
 
   
  com.sun.xml.ws.transport.http.servlet.WSServletContextListener
 
 

Paso 4: Desplegar en Tomcat , con el wizard se nota como en las siguientes figuras


Es probable que al momento de querer ver el WSDL del web service en el navegador, no se logre desplegar por la razón de que mi eclipse no tiene las librerias jax-ws como otros IDE's(Myeclipse por ejemplo)


Paso 5: Se debe descargar las librerías, para este caso yo utilce JAX-WS RI 2.2.8 http://jax-ws.java.net/
 Quedara de la siguiente forma


Y ahora si volvemos a desplegar el proyecto y nos dirigimos a http://localhost:8080/WSOperaciones/ServidorPort

o tambien http://localhost:8080/WSOperaciones/ServidorPort?wsdl y podremos ver nuestro WSDL

Paso 6: Ahora a probar con SOAP UI , solo necesitamos la url para hacerlo como se ve en la imagen

Ejecutamos y entonces el resultado se vera de la siguiente forma



A pero claro que tuve mis issues durante el desarrollo  que ahora menciono :



1.-Error configurando escuchador de aplicación de clase.

Este error salio al momento de querer desplegar el proyecto en tomcat, esto se soluciona con agregar las librerías JAX-WS que se descargan de http://jax-ws.java.net/

GRAVE: Error configurando escuchador de aplicación de clase com.sun.xml.ws.transport.http.servlet.WSServletContextListener
java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4149)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
19/08/2013 11:37:44 PM org.apache.catalina.core.StandardContext listenerStart
GRAVE: Se ha saltado la instalación de escuchadores de aplicación debido a error(es) previo(s)
19/08/2013 11:37:44 PM org.apache.catalina.core.StandardContext start
GRAVE: Error listenerStart
19/08/2013 11:37:44 PM org.apache.catalina.core.StandardContext start
GRAVE: Falló en arranque del Contexto [/WSOperaciones] debido a errores previos
19/08/2013 11:37:44 PM org.apache.coyote.http11.Http11Protocol start
INFO: Arrancando Coyote HTTP/1.1 en puerto http-8080
19/08/2013 11:37:44 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
19/08/2013 11:37:44 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/12  config=null
19/08/2013 11:37:44 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 282 ms


2.- javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException inguna de sus superclases se conocen en este contexto.

Este otro error me salio cuando quise consumir el servicio en soap ui, la solucion fue colocar una anotacion @XmlSeeAlso({Respuesta.class}) en clase Servidor ,que hace referencia al pojo que utilizo para retornar los valores de respuesta

GRAVE: caught throwable
javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
 - with linked exception:
[javax.xml.bind.JAXBException: class com.operaciones.basicas.Respuesta ni ninguna de sus superclases se conocen en este contexto.]
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:412)
at com.sun.xml.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:155)
at com.sun.xml.ws.api.message.MessageWrapper.writeTo(MessageWrapper.java:230)
at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:134)
at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:242)
at com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:464)
at com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:101)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:697)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:266)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.invokeAsync(ServletAdapter.java:225)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:161)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:197)
at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:81)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
Caused by: javax.xml.bind.MarshalException
 - with linked exception:
[javax.xml.bind.JAXBException: class com.operaciones.basicas.Respuesta ni ninguna de sus superclases se conocen en este contexto.]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:276)
at com.sun.xml.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:104)
at com.sun.xml.bind.api.Bridge.marshal(Bridge.java:145)
at com.sun.xml.ws.db.glassfish.BridgeWrapper.marshal(BridgeWrapper.java:176)
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:403)
... 26 more
Caused by: javax.xml.bind.JAXBException: class com.operaciones.basicas.Respuesta ni ninguna de sus superclases se conocen en este contexto.
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247)
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:262)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:653)
at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69)
at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172)
at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:361)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:271)
... 30 more
Caused by: javax.xml.bind.JAXBException: class com.operaciones.basicas.Respuesta ni ninguna de sus superclases se conocen en este contexto.
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:593)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:648)

... 36 more


Bueno por el momento es todo nos leemos en la proxima y coloco el proyecto completo para importalo


Saludos
Descarga Proyecto Aqui





5 comentarios:

  1. minino un hola mundo... para saber que esto lo es leido por alguien mas que yo..

    ResponderEliminar
  2. Anónimo10:10 a.m.

    Hola mundo

    ResponderEliminar
  3. Anónimo10:20 a.m.

    Ahora en serio, gracias!!
    Me ha servido de mucho el: @XmlSeeAlso({Respuesta.class})

    ResponderEliminar
  4. He notado que hay varias descargas del proyecto....Cuentenme como les va con el ejemplo ? si funciona ?

    ResponderEliminar
  5. Anónimo3:48 a.m.

    I would like to thank you for the efforts you have put in penning this site.
    I'm hoping to see the same high-grade content by you
    later on as well. In truth, your creative writing abilities has
    inspired me to get my own, personal website now ;)

    My webpage so comprar semillas de marihuana

    ResponderEliminar