title: Java InaccessibleWSDLException while accessing WSDL through client stubs
body: <p>I am trying to write custom Java client for Exchange Web Services.
  I have generated client stubs using <code>wsimport</code> tool as explained <a href="http://java.dzone.com/articles/jax-ws-hello-world" rel="nofollow">here</a> from EWS's Services.wsdl file. And now I have written code that uses these stubs. I am getting following exception:</p>
  
  <pre><code>Exception in thread "main" com.sun.xml.internal.ws.wsdl.parser.InaccessibleWSDLException: 2   counts of InaccessibleWSDLException.
  
  java.io.IOException: Got Server returned HTTP response code: 401 for URL: https://host.domain.com/ews/Services.wsdl while opening stream from https://host.domain.com/ews/Services.wsdl
  java.io.IOException: Got Server returned HTTP response code: 401 for URL: https://host.domain.com/ews/Services.wsdl?wsdl while opening stream from https://host.domain.com/ews/Services.wsdl?wsdl
  
  at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(Unknown Source)
  at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
  at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
  at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(Unknown Source)
  at com.sun.xml.internal.ws.client.WSServiceDelegate.&lt;init&gt;(Unknown Source)
  at com.sun.xml.internal.ws.client.WSServiceDelegate.&lt;init&gt;(Unknown Source)
  at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source)
  at javax.xml.ws.Service.&lt;init&gt;(Unknown Source)
  at com.microsoft.schemas.exchange.services._2006.messages.ExchangeWebService.&lt;init&gt;(ExchangeWebService.java:58)
  at com.xyz.abc.EWSJavaAPI.ExchangeAuthenticator.getExchangeServicePort(ExchangeAuthenticator.java:33)
  at com.xyz.abc.test.ExchangeDevelopmentTest.main(ExchangeDevelopmentTest.java:35)
  </code></pre>
  
  <p>As we can see above <code>ExchangeDevelopmentTest</code> is a client that uses another class <code>ExchangeAuthenticator</code> which in turn uses generated client stub <code>ExchangeWebService</code>. But up in the stack trace I got errors from Unknown Sources presumably JDKs' JARs.</p>
  
  <p>The <code>IOException</code> says it got <code>HTTP response code: 401</code>, that is for unauthorized access. But I have correctly specified the user name and password and also have included the needed certificate in the keystore. I am totally directionless where this exception is coming from. </p>
  
  <p>Code of the classes I wrote:</p>
  
  <p><strong>ExchangeAuthenticator</strong> </p>
  
  <pre><code>public class ExchangeAuthenticator {    
  /**
   * Obtains an authenticated ExchangeServicePortType with given credentials.
   *     
   */
      public ExchangeServicePortType getExchangeServicePort(String username, String password, String domain, URL wsdlURL) throws MalformedURLException {
          // Concatinate our domain and username for the UID needed in authentication.
          String uid = "domain" + "\\" + "uname";
  
          // Create an ExchangeWebService object that uses the supplied WSDL file, wsdlURL.
          ExchangeWebService exchangeWebService = new ExchangeWebService(wsdlURL, new QName("&lt;a href=\"http://schemas.microsoft.com/exchange/services/2006/messages\"&gt;http://schemas.microsoft.com/exchange/services/2006/messages&lt;/a&gt;", "ExchangeWebService"));
          ExchangeServicePortType port = exchangeWebService.getExchangeWebPort();
          // Supply your username and password when the ExchangeServicePortType is used for binding in the SOAP request.
          ((BindingProvider)port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, uid);
          ((BindingProvider)port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
  
          return port;
      }
  }
  </code></pre>
  
  <p><strong>ExchangeDevelopmentTest</strong></p>
  
  <pre><code>public class ExchangeDevelopmentTest {    
      public static void main (String[] args) {
          ExchangeAuthenticator exchangeAuthenticator = new ExchangeAuthenticator();
  
          // Print statement so we can easily see where our statements start in the Java console.
          System.out.println("Let's get started!");
  
          try {
              // Create a URL object which points at the .wsdl we deployed in the previous step.
              URL wsdlURL = new URL("https://172.17.245.196/ews/Services.wsdl");
              //URL wsdlURL = new URL("&lt;a href=\"https://172.17.245.196/ews/Services.wsdl\"&gt;https://172.17.245.196/ews/Services.wsdl&lt;/a&gt;");
              // Call to the class we just created to return an ExchangeServicePortType with authentication credentials.
              ExchangeServicePortType port = exchangeAuthenticator.getExchangeServicePort("uname", "password@123", "domain", wsdlURL);
  
              // Prints out the default toString() for the ExchangeServicePortType.
              System.out.println(port.toString());
          } catch (MalformedURLException ex) {
              // Catch any errors that may occur.
              Logger.getLogger(ExchangeDevelopmentTest.class.getName()).log(Level.SEVERE, null, ex);
              System.out.println(ex.getMessage()+"\n"+ex.getStackTrace());
          }
      }
  }
  </code></pre>
  
  <p><strong>ExchangeWebService</strong> </p>
  
  <p>Generated by JAX-WS with <code>wsimport</code> tool, other constructors and methods removed. Only contructor at line 58 which calls <code>super</code> (here <code>Service</code> class) constructor is kept.</p>
  
  <pre><code>@WebServiceClient(name = "ExchangeWebService", targetNamespace =     "http://schemas.microsoft.com/exchange/services/2006/messages", wsdlLocation = "file:/C:/Services.wsdl")
  public class ExchangeWebService extends Service
  { 
      private final static URL EXCHANGEWEBSERVICE_WSDL_LOCATION;
      private final static WebServiceException EXCHANGEWEBSERVICE_EXCEPTION;
      private final static QName EXCHANGEWEBSERVICE_QNAME = new QName("http://schemas.microsoft.com/exchange/services/2006/messages", "ExchangeWebService");
  
      static {
          URL url = null;
          WebServiceException e = null;
          try {
              url = new         URL("file:/C:/workspace/Server%20files/Client%20files/Services.wsdl");
          } catch (MalformedURLException ex) {
              e = new WebServiceException(ex);
          }
          EXCHANGEWEBSERVICE_WSDL_LOCATION = url;
          EXCHANGEWEBSERVICE_EXCEPTION = e;
      }
  
      //other constructos &amp; methods removed
      //line 58
      public ExchangeWebService(URL wsdlLocation, QName serviceName) {
          super(wsdlLocation, serviceName);
      }    
  }
  </code></pre>