As exceções são usadas na linguagem Java para assinalar que algo não correu como esperado.
Existem várias situações relacionadas com os Web Services que lançam exceções.
Os outputs seguintes foram produzidos usando o servidor hello-ws e o cliente hello-ws-cli e ilustram diversas situações.
As linhas mais importantes dos outputs são as começadas por
"Caused by:".
É aí que se podem encontrar as mensagens das exceções.
Dado que uma exceção pode ter outra exceção aninhada
(cause)
pode ser necessário consultar várias linhas para perceber o que causou a exceção de topo.
As linhas começadas por "at" indicam o contexto de execução. Observando estas linhas é possível ver o conteúdo da pilha de execução do programa, que diz que parte do código estava a chamar que outra parte.
Nesta situação o cliente ...-ws-cli tenta ir buscar o WSDL ao servidor ...-ws (que estava no localhost em tempo de compilação) e não consegue.
Caused by: javax.xml.ws.WebServiceException: Failed to access the WSDL at: http://localhost:8080/hello-ws/endpoint?WSDL. It failed with: Connection refused: connect. at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:265) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:246) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:209) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:178) at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:363) at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:321) at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:230) at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:211) at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:207) at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:114) at javax.xml.ws.Service.<init>(Service.java:77) at example.ws.HelloImplService.<init>(HelloImplService.java:42) at example.cli.HelloClient.main(HelloClient.java:13) ... 6 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at sun.net.NetworkClient.doConnect(NetworkClient.java:180) at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) at sun.net.www.http.HttpClient.<init>(HttpClient.java:211) at sun.net.www.http.HttpClient.New(HttpClient.java:308) at sun.net.www.http.HttpClient.New(HttpClient.java:326) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1168) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1104) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:932) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) at java.net.URL.openStream(URL.java:1038) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:999) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.java:400) at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:231) ... 17 more
Nos exemplos do ...-ws-cli,
o código gerado fica com uma dependência interna da localização do WSDL.
Pode-se consultar a classe gerada ...Service para confirmar que de facto assim é.
Para minorar este problema,
em vez de se ir buscar o WSDL diretamente ao servidor,
pode optar-se por aceder a um ficheiro.
Deve alterar-se o pom.xml para ir buscar o ficheiro WSDL à pasta do servidor,
que se assume estar ao lado da pasta do cliente.
... <plugin> <groupId>org.jvnet.jax-ws-commons</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>2.3</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> </execution> </executions> <configuration> <!-- https://jax-ws-commons.java.net/jaxws-maven-plugin/wsimport-mojo.html --> <wsdlDirectory>${basedir}/../calc-ws_wsdl/src/main/resources</wsdlDirectory> <wsdlFiles> <wsdlFile>Calc.wsdl</wsdlFile> </wsdlFiles> </configuration>
Em alternativa também se poderia copiar o ficheiro WSDL para calc-ws-cli/src/main/resources
Existe ainda a opção -clientjar da ferramenta wsimport.
Infelizmente, esta opção não é diretamente suportada pelo plug-in JAX-WS do Maven.
Uma solução possível
é pouco elegante.
Nesta situação o servidor ...-ws está indisponível.
Caused by: com.sun.xml.ws.client.ClientTransportException: HTTP transport error: java.net.ConnectException: Connection refused: connect at com.sun.xml.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:131) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:223) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:145) at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:139) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1136) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877) at com.sun.xml.ws.client.Stub.process(Stub.java:463) at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:191) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:92) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:161) at com.sun.proxy.$Proxy50.sayHello(Unknown Source) at example.cli.HelloClient.main(HelloClient.java:34) ... 6 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at sun.net.NetworkClient.doConnect(NetworkClient.java:180) at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) at sun.net.www.http.HttpClient.<init>(HttpClient.java:211) at sun.net.www.http.HttpClient.New(HttpClient.java:308) at sun.net.www.http.HttpClient.New(HttpClient.java:326) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1168) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1147) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:932) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1282) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1257) at com.sun.xml.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:119) ... 20 more
Na hierarquia de classe da exceção, o super tipo que faz parte da API é javax.xml.ws.WebServiceException.
java.lang.Object extended by java.lang.Throwable extended by java.lang.Exception extended by java.lang.RuntimeException extended by javax.xml.ws.WebServiceException extended by com.sun.xml.ws.util.exception.JAXWSExceptionBase extended by com.sun.xml.ws.client.ClientTransportException
A exceção abaixo é lançada quando o servidor de nomes jUDDI não está a correr no endereço esperado.
Caused by: javax.xml.registry.JAXRException: org.apache.ws.scout.transport.TransportException: java.lang.reflect.InvocationTargetException at org.apache.ws.scout.registry.BusinessQueryManagerV3Impl.findOrganizations(BusinessQueryManagerV3Impl.java:136) at example.ws.uddi.UDDINaming.queryAll(UDDINaming.java:307) at example.ws.uddi.UDDINaming.query(UDDINaming.java:336) at example.ws.uddi.UDDINaming.lookup(UDDINaming.java:251) at example.cli.HelloClient.main(HelloClient.java:28) ... 6 more Caused by: org.apache.ws.scout.transport.TransportException: java.lang.reflect.InvocationTargetException at org.apache.ws.scout.registry.RegistryV3Impl.execute(RegistryV3Impl.java:256) at org.apache.ws.scout.registry.RegistryV3Impl.findBusiness(RegistryV3Impl.java:670) at org.apache.ws.scout.registry.BusinessQueryManagerV3Impl.findOrganizations(BusinessQueryManagerV3Impl.java:110) ... 10 more Caused by: org.apache.ws.scout.transport.TransportException: java.lang.reflect.InvocationTargetException at org.apache.ws.scout.transport.LocalTransport.send(LocalTransport.java:83) at org.apache.ws.scout.registry.RegistryV3Impl.execute(RegistryV3Impl.java:254) ... 12 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.apache.ws.scout.transport.LocalTransport.send(LocalTransport.java:74) ... 13 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.apache.juddi.v3.client.transport.wrapper.RequestHandler.invoke(RequestHandler.java:176) at org.apache.juddi.v3.client.transport.wrapper.UDDIInquiryService.inquire(UDDIInquiryService.java:114) ... 18 more Caused by: com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.ConnectException: Connection refused: connect at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:117) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:208) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:130) at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:124) at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:1121) at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:1035) at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:1004) at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:862) at com.sun.xml.internal.ws.client.Stub.process(Stub.java:448) at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:178) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77) at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147) at com.sun.proxy.$Proxy55.findBusiness(Unknown Source) ... 24 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at sun.net.NetworkClient.doConnect(NetworkClient.java:180) at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) at sun.net.www.http.HttpClient.(HttpClient.java:211) at sun.net.www.http.HttpClient.New(HttpClient.java:308) at sun.net.www.http.HttpClient.New(HttpClient.java:326) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1168) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1147) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:932) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1282) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1257) at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:104) ... 37 more
A exceção abaixo acontece quando há uma unhandled exception no servidor (no caso, uma NullPointerException).
Caused by: com.sun.xml.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: throw by hello-ws Please see the server log to find more detail regarding exact cause of the failure. at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193) at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:131) at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:203) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:290) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:92) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:161) at com.sun.proxy.$Proxy50.sayHello(Unknown Source) at example.cli.HelloClient.main(HelloClient.java:34) ... 6 more
Na hierarquia de classe da exceção, o super tipo que faz parte da API é javax.xml.ws.soap.SOAPFaultException.
java.lang.Object extended by java.lang.Throwable extended by java.lang.Exception extended by java.lang.RuntimeException extended by javax.xml.ws.WebServiceException extended by javax.xml.ws.ProtocolException extended by javax.xml.ws.soap.SOAPFaultException extended by com.sun.xml.ws.fault.ServerSOAPFaultException
Na situação abaixo é lançada uma exceção correspondente a uma SOAP Fault mas não é especificada uma faultInfo (tipo contentor de dados da fault).
Caused by: com.sun.xml.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: throw by hello-ws Please see the server log to find more detail regarding exact cause of the failure. at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193) at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:131) at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:203) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:290) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:92) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:161) at com.sun.proxy.$Proxy52.sayHello(Unknown Source) at example.cli.HelloClient.main(HelloClient.java:34) ... 6 more
Neste caso o servidor deve ser modificado para incluir uma fault info na exceção atirada.
Na exceção abaixo é lançada uma exceção correspondente a uma SOAP Fault e é especificada uma faultInfo (tipo contentor de dados da fault).
Caused by: example.ws.HelloFault_Exception: error in server at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:150) at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:203) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:290) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:92) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:161) at com.sun.proxy.$Proxy52.sayHello(Unknown Source) at example.cli.HelloClient.main(HelloClient.java:34) ... 6 more
A exceção example.ws.HelloFault_Exception é gerado pela ferramenta wsimport.
© Docentes de Sistemas Distribuídos,
Dep. Eng. Informática,
Técnico Lisboa