Come posso chiamare un servizio web da un altro web-service (all’interno della stessa GUERRA)

Contesto: Application Server Glassfish 3.1.2. La tecnologia Jee JAX-WS. L’IDE Netbeans 7.1.1.

Ho creato 2 servizi web a partire dal WSDL utilizzando wsimport. Né sono EJB s. Entrambi utilizzano le @WebService annotazione. Entrambi vivono nella GUERRA stessa (non sono sicuro che dovrebbe essere rilevante, ma potrebbe essere). Posso implementare e testare entrambi i servizi molto felicemente individualmente, utilizzando SOAP-UI, come un client.

Ora voglio ottenere WebService1 chiamare WebService2 in fase di runtime. Non voglio chiamare il impl di webservice2 utilizzando java localmente (per così dire) – mi piacerebbe chiamare webservice2 correttamente, come un webservice, al fine di creare un perdente di accoppiamento.

Nell’IDE posso generare il codice necessario per il webservice chiamata la ‘genera codice: servizio web richiamare il funzionamento della funzione. Questo ha aggiunto un @WebServiceRef(wsdlLocation = “WEB-INF/wsdl/nomeservizio.wsdl”) e un po ‘ di codice per creare una porta e chiamare il target operazione di webservice.

    //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);

Compila bene, ma in fase di runtime di un esito negativo. La distribuzione è un successo, e i servizi sono entrambi in aumento e generalmente felici singolarmente (come non chiamare questo codice), ma quando un webservice prova a chiamare l’altro ho un

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

Qui di seguito ulteriori dettagli.

Qualcuno sa perché questo potrebbe succedere? Dove ho sbagliato? Ciò che ho trascurato?

Qualsiasi aiuto, molto apprezzato.

———————— ECCEZIONE ———————


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 Replies
  1. 2

    Penso di aver risolto

    C’erano 2 problemi, e dopo la correzione di questi errori il mio codice funziona come dovrebbe.

    Numero #1. (minore)
    Il jax-ws-catalog.xml non contiene un riferimento al WSDL o file XSD per WebService2. Questo è necessario per aiutare il JAX-WS quadro di utilizzare una copia locale del file WSDL in fase di runtime, senza bisogno di caricare il WSDL o XSD su HTTP.

    Problema #2. (principali)
    La sezione ‘Servizio’ nel WSDL cui fa riferimento il jax-ws-catalogo deve avere un accurato endpoint posizione all’interno di esso. In fase di runtime server di riscrivere questo po ‘ di WSDL per la corretta endpoint http posizione di servizio per le varie configurazioni (come i dettagli in @webservice annotazione per esempio). Naturalmente, quando si ‘a partire da WSDL’ questo endpoint potrebbe essere del tutto fittizio, perché il contratto di servizio è svincolato da qualsiasi applicazione (come nel mio caso). Pertanto, quando JAX-WS preleva il file WSDL dal percorso specificato nel jax-ws-catalogo, trova una posizione http che non esiste e non può essere risolto. Quindi la “ClientTransportException: The server sent HTTP status code 404: Not Found.” – l’URL del WSDL stata la colpa.

    Sintesi.
    La soluzione è stata quella di aggiungere un’accurata endpoint posizione per il webservice per il WSDL del servizio definizione di sezione, e per assicurarsi che il file WSDL e XSD sono correttamente elencati nel jax-ws-catalogo.

  2. 1

    Un modo migliore per avvicinarsi a questo è quello di rendere il servizio web di un livello che poi chiama la logica dell’applicazione. Quindi quando un insieme di logica di business ha bisogno di chiamare il set di altri, non dover passare attraverso un inutile http andata e ritorno. Si consiglia di utilizzare qualcosa come la Primavera con @Service e @Autowired. In EJB mondo (e so che hai detto che non sei ancora in uso che) questo è fatto con @interfacce Locali e @EJB session iniezione quindi non stai attraversando un enorme API remote stack solo per chiamare un metodo di un’altra classe.

    • Sto cercando di applicare il Contratto di Centralizzazione SOA Modello che sostiene che il contratto di servizio dovrebbe essere l’unico modo che un client utilizza un servizio. E ‘ un modo per realizzare un perdente di traino, evitando direttamente al consumatore per l’attuazione di accoppiamento (ad esempio, direttamente al EJB).
    • Non stavo sostenendo che il cliente di rivolgersi direttamente ad una Molla @Service o per un @Stateless bean di sessione. Sto dicendo che la logica di business deve essere considerato un servizio web strato parla. Quindi un dato chiamate ai servizi web di un servizio di business, non sapendo nulla di ciò che il servizio business fare internamente. Il servizio di business quindi può essere una composizione di servizi business.
  3. 1

    Uno ha bisogno di incorporare un client web il primo servizio web, che poi chiede le informazioni del secondo servizio web. Questo client da apache è stato utilizzato con buoni risultati.

    Occasionalmente, un servizio web libreria contiene anche un web client per facilitare il test. Se il tuo libararies contenere un client, non hai nemmeno bisogno di aggiungere un client web di attuazione.

    — A cura di rispondere alla domanda se l’esempio jaxws API fornisce “client” di supporto —

    Certamente JAX-WS ha tutto per impostare un servizio web, ma sono incerto se fa parte delle specifiche che contengono anche tutto ciò che chiamare un servizio web. Non ho visto un’implementazione che manca di una tale struttura, in modo da rispondere che “ogni tanto” la biblioteca contiene un client è stata un po ‘ un’esagerazione l’occasione è mancante.

    In ogni caso, le classi per il supporto di un client basta avvolgere XML generatori e i client HTTP.

    Se la memoria non mi inganna, è possibile ottenere una copia del file WSDL, che viene letto da un “compilatore” che uscite di codice sorgente Java in un pacchetto specificato spazio dei nomi. Quindi, utilizzando le classi generate, si dispone di un livello API di accesso al servizio web remoto. Il risultato finale assomiglia a questo

    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));
    } 

    Dove si crea il “lato client per il servizio” mediante la costruzione di un XXXService oggetto, e quindi collegare ad esso, producendo un delegato oggetto di tipo XXXDelegate. I metodi di delegare effettivamente generare nuovi oggetti (un oggetto esiste per ogni associazione porta “SomeCall.java”) che incapsulano la richiesta, e la risposta è gestito da un “SomeCallReply.java” file, che il delegato utilizza quindi decomprimere la risposta e restituire il valore per il “cliente” codice.

    Un esempio può essere trovato in fondo a questo tutorial. Di nuovo, questo è il mio modo di comprendere l’alto livello di roba, i dettagli possono essere cambiati nel versioni più recenti di esempio jaxws. Quando ho scavato in profondità, era abbastanza presto nel gioco. Ci sono stati un sacco di versioni di esempio jaxws dal.

    • Penso di capire cosa vuoi dire, ma non si dispone di un punto di riferimento che si potrebbe puntare anche a me?
    • Ero certo che JAX-WS quadro di fornire tutto il necessario per consumare un altro servizio senza dover ricorrere ad altre HTTP quadri. Non è forse vero?
    • Per quanto ne so è vero, ma non sapevo se era sempre true, quindi scusate se ho esagerato la “a volte”. Leggerlo di nuovo, posso facilmente vedere come mi implicita che è stato raramente vero. Mi dispiace per la confusione.

Lascia un commento