Labs SD > Web Services

Web Services Exceptions

Exceções de Web Services

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.


hello-ws-cli ->?WSDL X(hello-ws)

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.


hello-ws-cli -> X(hello-ws)

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

hello-ws-cli -> X(jUDDI)

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

hello-ws-cli <- hello-ws^NPE

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

hello-ws-cli <- hello-ws^fault-without-info

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.


hello-ws-cli <- hello-ws^fault-with-info

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