Contexto: Servidor de Aplicaciones Glassfish 3.1.2. Tecnología JavaEE JAX-WS. IDE Netbeans 7.1.1.

He creado 2 servicios web a partir de WSDL mediante wsimport. Tampoco son los EJB. Ambos utilizan el @WebService anotación. Ambos viven en la misma GUERRA (no estoy seguro de que debe ser relevante, pero puede ser). Puedo implementar y probar ambos servicios, muy contenta, de forma individual, utilizando JABÓN-interfaz de usuario como un cliente.

Ahora quiero conseguir WebService1 llamar WebService2 en tiempo de ejecución. Yo no quiero llamar a la impl de webservice2 el uso de java (localmente por así decirlo) – me gustaría llamar webservice2 correctamente, como un webservice, con el fin de crear un acoplamiento más suelto.

En el IDE puede generar el código necesario para el webservice de la llamada utilizando el «generar código: servicio web de invocar la operación de la» característica. Esto se ha añadido un @WebServiceRef(wsdlLocation = «WEB-INF/wsdl/servicename.wsdl») y algo de código para crear un puerto y la llamada del destino webservice operación.

    //Call Web Service Operation
   Identity port = service.getIdentityPort();
   String req = "";
   javax.xml.ws.Holder<StructureMessageHeader> idHeader = new javax.xml.ws.Holder<StructureMessageHeader>();
   String result = port.getIdentifier(req, idHeader);

Esto compila bien, pero en tiempo de ejecución se produce un error. La implementación es un éxito, y los servicios son tanto y generalmente felices individualmente (siempre que no llame a este código), pero cuando uno webservice intenta llamar a la otra tengo un

ClientTransportException: The server sent HTTP status code 404: Not Found.

Más detalles a continuación.

¿Alguien sabe por qué esto podría suceder? ¿De dónde me salen mal? Lo he pasado por alto?

Cualquier ayuda, muchas gracias.

———————— EXCEPCIÓN ———————


com.sun.xml.ws.client.ClientTransportException: The server sent HTTP status code 404: Not Found at com.sun.xml.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:321) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:270) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:228) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:143) at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:110) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:116) at com.sun.enterprise.security.webservices.ClientSecurityPipe.processSecureRequest(ClientSecurityPipe.java:196) at com.sun.enterprise.security.webservices.ClientSecurityPipe.process(ClientSecurityPipe.java:184) at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.client.Stub.process(Stub.java:429) at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:168) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151) at $Proxy219.getIdentifier(Unknown Source) at com.soagrowers.r20121231.product.master.services.ProductsEntityService.createProduct(ProductsEntityService.java:138) 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.glassfish.webservices.InstanceResolverImpl$1.invoke(InstanceResolverImpl.java:143) at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:149) at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:94) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:116) at org.glassfish.webservices.MonitoringPipe.process(MonitoringPipe.java:142) at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:116) at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:212) at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:144) at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:386) at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:640) at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263) at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:163) at org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:145) at javax.servlet.http.HttpServlet.service(HttpServlet.java:688) at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:662)

InformationsquelleAutor benwilcock | 2012-05-24

3 Comentarios

  1. 2

    Creo que he solucionado

    Hay 2 problemas, y después de la fijación de estos errores de mi código es ahora funciona como debería.

    Problema #1. (menor de edad)
    El jax-ws-catalog.xml no contienen una referencia a la WSDL o archivos XSD para WebService2. Esto es necesario para ayudar a la JAX-WS marco para utilizar una copia local de los WSDL en tiempo de ejecución sin necesidad de cargar el WSDL o XSD es a través de HTTP.

    Problema #2. (importante) de la
    El ‘Servicio’ de la sección en el WSDL que se hace referencia en la jax-ws-catálogo de necesidades para tener una exacta extremo ubicación dentro de ella. En el tiempo de ejecución de los servidores de la reescritura de este poco de el WSDL para la correcta http extremo de la ubicación del servicio como por las distintas configuraciones (como los detalles en el @webservice anotación por ejemplo). Por supuesto que cuando se inicio a partir de WSDL’ este extremo podría ser totalmente ficticios, porque el contrato de servicio es independiente de cualquier aplicación (como fue en mi caso). Por lo tanto, cuando JAX-WS recoge el WSDL desde la ubicación especificada en la jax-ws-catálogo, se encuentra en una ubicación http que no existe y no puede ser resuelto. De ahí la «ClientTransportException: The server sent HTTP status code 404: Not Found.» – la URL del WSDL fue la culpa.

    Resumen.
    La solución fue añadir una precisa extremo de ubicación para el webservice para el WSDL del servicio definición de la sección, y para asegurarse de que el WSDL y XSD fueron aparece correctamente en la jax-ws-catálogo.

  2. 1

    Una mejor manera de abordar esto es hacer que el servicio web de una capa que, a continuación, llama a la lógica de la aplicación. Entonces, cuando un conjunto de negocios de la lógica de las necesidades de llamar a los demás, no tener que ir a través de una innecesaria http ida y vuelta. Considere el uso de algo como la Primavera con @Servicio y @Autowired. En EJB mundo (y yo sé que usted dijo que usted no está utilizando que) esto se hace con @interfaces Locales y @EJB de sesión de inyección, así no vas a través de una enorme API remota de la pila sólo para llamar a un método de otra clase.

    • Estoy tratando de aplicar el Contrato de Centralización SOA Patrón que aboga por que el contrato de servicios debe ser la única manera de que un cliente consume un servicio. Es una manera de lograr un acoplamiento más suelto, evitando a los consumidores directos de la implementación de acoplamiento (por ejemplo, directamente a los EJB).
    • Yo no estaba abogando por que el cliente hable directamente a un Resorte de @Service o a un @Stateless bean de sesión. Estoy diciendo que la lógica de negocio debe ser considerado un servicio que la capa de web habla. A continuación, una web determinada servicio de llamadas de una empresa de servicio, de no saber nada acerca de lo que un servicio de negocio está haciendo internamente. El servicio de negocio, a continuación, puede ser una composición de servicios empresariales.
  3. 1

    Que uno necesita para incrustar un cliente web en el primer servicio web, el cual se pide la información de la web de segundo servicio. Este cliente de apache ha sido utilizada con buenos resultados.

    De vez en cuando un servicio web de la biblioteca también contiene un embedded web de cliente para facilitar las pruebas. Si su libararies contienen un cliente, usted ni siquiera necesita para añadir un extra de cliente web de la aplicación.

    — Editado para responder a la pregunta acerca de si la JAXWS API proporciona «cliente» de apoyo —

    Ciertamente JAX-WS tiene todo lo necesario para configurar un servicio web, pero no estoy seguro si es parte de la especificación de que también contienen de todo, llamar a un servicio web. No he visto una aplicación que carece de una instalación de este tipo, por lo que responde que «en ocasiones» la biblioteca contiene un cliente era un poco exageradas sobre la posibilidad de que falta.

    En cualquier caso, las clases para apoyar a un cliente simplemente envuelva XML generadores y clientes HTTP.

    Si la memoria no me falla, se puede obtener una copia de WSDL, que es leído por un «compilador» que las salidas de código fuente de Java en un determinado paquete de espacio de nombres. A continuación, utilizando las clases generadas, tiene un nivel de API de acceso al servicio web remoto. El resultado final se parece a esto

    public static void main(String[] args) {
        /* Create the service instance */
        CalculatorService service = new CalculatorService();
        CalculatorDelegate delegate = service.getCalculatorPort();
    
        /* Using the web service, perform the 4 calculations */
        System.out.println("1. 3+7=" + delegate.add(3, 7));
        System.out.println("2. 12-2=" + delegate.subtract(12, 2));
        System.out.println("3. 9*9=" + delegate.multiply(9, 9));
        System.out.println("4. 40/2=" + delegate.divide(40, 2));
    } 

    Donde se crea el «lado del cliente vista del servicio» mediante la construcción de un XXXService objeto y, a continuación, adjuntar a ella produciendo un objeto delegado de tipo XXXDelegate. Los métodos en el delegado generar nuevos objetos (un objeto existe para cada puerto de la unión «SomeCall.java») que encapsulan la solicitud, y la respuesta es manejado por un «SomeCallReply.java» archivo, que luego el delegado usa para explicar la respuesta y devolver el valor a «el cliente» de código.

    Un ejemplo se puede encontrar en la parte inferior de este tutorial. De nuevo, este es mi entendimiento de que el alto nivel de cosas, los datos pueden haber cambiado en las versiones más recientes de JAXWS. Cuando me cavado profundo, era bastante temprano en el juego. Ha habido un montón de versiones de JAXWS desde entonces.

    • Creo que entiendo lo que quieres decir, pero ¿tiene usted una referencia que podría apuntar a mí también?
    • Yo estaba seguro de que el JAX-WS marco daría todo lo que yo necesitaba para consumir otro servicio sin tener que recurrir a otras HTTP marcos. No es esto cierto?
    • Como yo sé que es verdad, pero yo no sabía si era de siempre verdad, así que lo siento si he exagerado el «a veces». La lectura de nuevo, me puede ver fácilmente cómo me implícita de que rara vez era cierto. Lo siento por la confusión.

Dejar respuesta

Please enter your comment!
Please enter your name here